函数参数

Vimscript 函数当然是可以接受参数的。运行以下命令:

:function DisplayName(name)
:  echom "Hello!  My name is:"
:  echom a:name
:endfunction

运行函数:

:call DisplayName("Your Name")

Vim 会显示两行:Hello! My name is: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。当你在 Vim 中定义一个接受可变参数的函数, a:0 会被设置为你传的额外参数的数量。在这个例子中,我们传了两个参数给 Varg , 所以 Vim 显示 2

第二行回显 a:1,显示 a。你可以用 a:1a:2 等等,来表示函数收到的每个额外的参数。 如果我们用 a:2,Vim 会显示“b”。

第三行就有点棘手了。当函数有可变参数时,a:000 会被设置为包含传入的额外参数的一个列表。 我们还没有讲过列表,所以不要太担心这个。你不能一起使用 echom 和列表, 这就是为什么我们在这行要用 echo

你也可以和普通变量一起使用可变变量。运行以下命令:

: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")

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

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/24.html