Vim函数,当然也可以接受参数,运行下面的命令:
:function DisplayName(name)
: echom "Hello! My name is:"
: echom a:name
:endfunction
运行这个函数:
:call DisplayName("Your Name")
Vim会输出两行文本:“Hello! My nameis:”和“Your Name”。
注意传给echom命令的参数前面的a:,这个代表一个变量范围,这个我们之前就讨论过的。
现在让我们去掉这个变量范围的前缀,再看看vim怎么反应的。运行下面的命令:
:function UnscopedDisplayName(name)
: echom "Hello! My name is:"
: echom name
:endfunction
:call UnscopedDisplayName("Your Name")
这次Vim会提示找不到变量name。
当你在写一个vimscript函数,并且接受传参时,你都需要在变量名前加上a:,来告诉vim这是一个本地变量。
Vimscript函数可以像Javascript和Python一样接变长参数。运行下面的命令:
:function Varg(...)
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg("a","b")
这个函数向我们展示了几个事情,让我们来一个一个地看看。
函数里的...告诉vim这个函数可以接受任意数目的参数。这个和Python函数里的*args一样。
第一行输出a:0也就是输出“2” 。当你定义一个函数,它接受一连串的参数时,a:0会被设置成参数的数目。在这个例子里,我们传入了两个参数,所以vim会输出“2”.
第二行输出a:1也就是输出“a”。你可以用a:1,a:2等来引用每个你接收到的参数。如果你用a:2,vim会输出“b”。
第三行有点纠结了。当一个函数的参数是可变参数时,a:000会被设置成包含所有参数的列表。我们现在还没有讲过列表,不用担心,我后面会讲解的。你不用给echom传递一个列表,这就是为什么我们第三行用echo来代替echom了。
你也可以混用可变参数和一般参数。运行下面的命令:
:function Varg2(foo,...)
: echom a:foo
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg2("a","b","c")
你可以看到vim把“a”赋值给a:foo,然后后面的命令都被放到可变参数列表里。
运行下面的命令:
:function Assign(foo)
: let a:foo = "Nope"
: echom a:foo
:endfunction
:call Assign("test"0
Vim会抛出一个错误,因为你不能再次给形式参数赋值。现在运行下面的命令:
:function AssignGood(foo)
: let foo_tmp = a:foo
: let foo_tmp = "Yep"
: echom foo_tmp
:endfunction
:call AssignGood("test“)
这次,函数起作用了,并且vim会输出“Yep”。