Vim的函数
Vim中使用function ... endfunction
定义函数。
需要注意的是,Vim中的函数如果没有标明作用域(前缀s:),那么函数必须以大写字母开头。事实上,Vimer约定所有的函数都用大写字母开头,无论有没有作用域。
使用function!可以避免重复载入时候的冲突。
下面是定义一个简单的函数。
1 2 3 |
:function Meow() : echom "Meow!" :endfunction |
调用方法是:call Meow()
。
也可以使用返回值。
1 2 3 |
:function GetMeow() : return "Meow String!" :endfunction |
可以将返回值打印出来。
1 |
:echom GetMeow() |
返回值
如果函数没有提供返回值,会返回数字0(即假)。
下面的这个判断宽度是不是太大的函数,在调用的时候就可以直接使用。
1 2 3 4 5 6 7 8 9 10 |
:function TextwidthIsTooWide() : if &l:textwidth ># 80 : return 1 : endif :endfunction :set textwidth=80 :if TextwidthIsTooWide() : echom "WARNING: Wide text!" :endif |
函数参数
Vim的函数当然也可以接受参数。下面的函数声明和调用展示了Vim的函数参数用法。
1 2 3 4 5 6 7 |
:function DisplayName(name) : echom "Hello! My name is:" : echom a:name :endfunction " 调用 :call DisplayName("Your Name") |
注意,变量的a:
前缀是标志作用域。如果删去,Vim就找不到这个变量了。
在VimScript中,如果要函数接受变量,那么任何时候使用这个变量都要带上a:
前缀,来告诉Vim他们在函数参数作用域中(argument scope)。
可变长度的参数
和Python,JavaScript一样,VimScript可以接受不确定数量的参数。见以下代码。
1 2 3 4 5 6 7 |
:function Varg(...) : echom a:0 : echom a:1 : echo a:000 :endfunction :call Varg("a", "b") |
其中:
...
表示这个函数可以接受任意数量的参数,和Python的*args
一样a:0
表示这个函数的可变长度的参数的个数,我们传给Varg两个参数,那么a:0
就是2a:1
a:2
等等就是调用第n个参数a:000
是所有可变长度参数组成的列表(数组),这里会打印出["a", "b"]
可变长度的参数可以和普通的参数一起用,和Python一样。
1 2 3 4 5 6 7 8 |
:function Varg2(foo, ...) : echom a:foo : echom a:0 : echom a:1 : echo a:000 :endfunction :call Varg2("a", "b", "c") |
参数不能重新赋值
下面的代码,会抛出一个错误,因为Vim不允许对函数传进来的参数重新赋值。
1 2 3 4 5 6 |
:function Assign(foo) : let a:foo = "Nope" : echom a:foo :endfunction :call Assign("test") |
为此,我们一般不直接使用传进来的参数,函数的开始一般会将进来的参数复制给新的变量,在函数中使用新的变量。
1 2 3 4 5 6 7 |
:function AssignGood(foo) : let foo_tmp = a:foo : let foo_tmp = "Yep" : echom foo_tmp :endfunction :call AssignGood("test") |