Vim技能修炼教程(14) - 写个ex命令吧

写个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结构,还可以用来处理资源释放。

猜你喜欢

转载自blog.csdn.net/lusing/article/details/75261506
今日推荐