Vimscript编程指南

函数传参

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”。

练习

  • 阅读:help function-argument的前两章。
  • 阅读:help local-variables。