写个ex命令吧
我们第二节开始就写了语法高亮的插件。直接这一节,我们学习第二种插件的写法,就是写个我们自己的ex命令。
自定义ex命令的命令是:command,我们在~/.vim/下建立一个plugin目录,然后创建一个test.vim之类的文件:
:function Hello()
:echom "Hello,World!"
:endfunction
:command Hello call Hello()
首先,我们定义一个函数。函数名的首字母必须大写。函数中调用:echom去显示一个字符串。
然后我们通过:command来定义一个ex命令,命令的作用是去调用Hello()函数。
有了写新的ex命令的出口,我们现在终于可以使用Vimscript欢快地编程啦。
if语句
作为最基础的分支语句,if将面临学习Vimscript中的第一个坑,就是字符串的真假性的问题。
我们看下下面的例子:
:function Hello()
:if "Hello"
:echom "Hello is true"
:else
:echom "Hello is false"
:endif
:endfunction
我们可以通过:call Hello()来调用它,或者干脆封装成一个ex命令。
:command Hello call Hello()
不管如何,输出结果为:Hello is false。也就是说,Vimscript将"Hello"字符串转换成了数字0,于是,它是v:false.
字符串比较
另外在比较时需要注意的是字符串比较。在Vim中,"=="比较字符是否大小写敏感是跟用户的设置相关的。如果不想受这个影响,建议使用确定的大小写不敏感比较符"==?"和大小写敏感比较符"==#"
不光是"==", "!=", ">", "<", ">=", "<=", "is", "isnot"都有对就应大小写敏感和不敏感的版本。
正则匹配也是一样,"="和"!"也有"=#"和"=?"的版本。
函数
- 定义函数 :function, :endfunction
- 返回值 :return
- 调用函数 :call
在函数中使用参数时,请注意使用a:这个作用域描述符。
另外,与大部分vim命令一样,函数调用:call命令支持使用范围来调用。我们看个例子:
:function HelloArgs(arg)
:echom "Hello!" . a:arg
:endfunction
我们输入:
1,3call HelloArgs(getline("."))
结果为:
Hello!:function HelloArgs(arg)
Hello!:echom "Hello!" . a:arg
Hello!:endfunction
除了通过范围调用外,函数参数也可以支持不定个数。其实就是以列表方式传递参数。
循环结构
上节讲列表的时候,我们已经学习了for循环。
while循环
Vimscript还支持:while循环,例:
:function PrintStar(arg)
:let l:c = 0
:while l:c<a:arg
:echo "*"
:let l:c += 1
:endwhile
:endfunction
arg将是打印的行数,我们这么调用:
:call PrintStar(10)
break和continue
Vimscript中也支持:break退出循环和:continue继续下一次循环。
异常处理
Vimscript支持,:try ... :catch ... :finally :endtry的结构。
当然也支持:throw抛出一个异常。
try...finally结构,还可以用来处理资源释放。