在python中我会做这样的事情:
def functionName(arg1,arg2=false,arg3=false):
if arg2:
#Do stuff with arguments
else:
#Do stuff without arguments
我尝试做
function FunctionName(arg1,arg2=false,arg3=false)
,但这只会给我一个错误提示,指出参数无效。我该如何在vimscript中执行此操作?
#1 楼
是的,您可以在函数中使用可选参数。它不像python那样方便,但是这是您的方法:function FooBar(...) " This is like *args in python
echom a:0 " a:0 contains an integer which is the number of arguments passed to the function
echom a:1 " a:1 contains the first argument passed, a:2 contains the second and so on
echo a:000 " a:000 contains a list of all arguments that were passed to the function
endfunction
请注意,您最多只能以这种方式包含20个参数。
相关帮助主题:
:help :function
:help function-argument
#2 楼
参加聚会有点晚了,但是我没有看到我最喜欢的一个: br />#3 楼
通过这种模式,您可以为每个参数分配有意义的名称,并为未提供的任何参数提供默认值:br />
a:0
计算传递的可选参数的数量a:1
,a:2
,...让我们访问可选参数强制性参数(在上面的示例中仅
foo
)不计算在内。 因此,如果未提供第三个参数,则
condition ? result_if_true : result_if_false
将采用默认值baz
。与上述示例有关的一个问题是,只能使用以下命令访问
0
a:foo
前缀,而a:
和bar
可以不带前缀。由于这不是很一致,因此您可能希望将所有参数都拉出局部变量,如下所示:function FunctionName(foo, ...)
let bar = a:0 >= 1 ? a:1 : 0
let baz = a:0 >= 2 ? a:2 : 0
...
" Code that makes use of a:foo, bar and baz
(从技术上讲,您可以使用
baz
前缀来引用函数内部的局部变量,例如l:
,但这是多余的,所以我不建议这样做。) br /> function FunctionName(...)
let foo = a:1 " Will throw an error if no arg was provided
let bar = a:0 >= 2 ? a:2 : 0
let baz = a:0 >= 3 ? a:3 : 0
...
" Code that makes use of foo, bar and baz
l:baz
允许您在运行时重新定义函数(例如,通过重新加载脚本),而!
则将函数限制为脚本作用域。如果仅从脚本内的其他位置引用您的函数,则可以避免污染全局名称空间(并且有发生冲突的危险)。通常,在不需要全局可见的功能时,这是定义功能的首选方法。 ;-) 评论
a:0不包含固定的命名参数。 a:1是...中的第一个参数(仅在VIM 8.0中进行了测试)
– Boris Brodski
18年4月30日在11:54
谢谢@BorisBrodski,您说得对,很好。我已经纠正了答案。
– joeytwiddle
18年5月1日在14:44
#4 楼
我不太熟悉vimscript,但这是我的方法:function Func(foo, ...)
if a:0 < 1
let bar = "Unspecified bar"
else
let bar = a:1
endif
if a:0 < 2
let baz = "Unspecified baz"
else
let baz = a:2
endif
echo a:foo
echo bar
echo baz
endfunction
然后您可以
call Func("Hello", "World")
,看到它显示“ Hello”,“世界”,“未指定的baz”。这是使用vim函数的varargs功能,它使您可以将任意数量的额外参数传递给该函数。这些参数存储在变量中,这些变量取决于
a:0
(额外参数列表的长度)而被设置为相应的参数或默认值。#5 楼
由于Vim 8.1.1310还支持真正的可选函数参数。但是,这意味着大多数vim安装尚不支持此功能。另外neovim也没有提供该功能。
:help optional-function-argument
中的示例: function Something(key, value = 10)
echo a:key .. ": " .. a:value
endfunction
call Something('empty') "empty: 10"
call Something('key', 20) "key: 20"
评论
整齐。您应该扩展您的答案以举一个例子,以便我们可以快速理解它所添加的内容。
–卢克·赫米特(Luc Hermitte)
19年11月21日在10:53
@LucHermitte我相应地修改了答案。
– radlan
19年11月22日在8:52
评论
哦,太好了!
– joeytwiddle
17年9月6日在1:57
我知道这太老了,但仅供任何读者阅读。您不能再在vim中设置a:arg =。您必须使用let l:arg =之类的东西,或者只是让arg =。见github.com/vim/vim/commit/…
– jmzagorski
19年2月21日在18:37
哪里有文件记录?与a:000相同吗?
–user202729
20-4-8在6:46
@ user202729检出:help内部变量,有一点解释,像“ a:”或“ s:”这样的范围可以用作字典。它与a:000不太一样,因为它是一个列表,因此它是零索引的,您将需要使用get(a :, n-1,default)代替,但是除此之外,您可以毫无问题地使用它。
– phicr
20-4-10的3:39