在 Vimscript 中,如何从列表中跳过解构赋值中的元素?
In Vimscript, how to skip over elements in a destructuring assignment from a list?
Vimscript 有类似列表解构赋值的东西。例如:
:let [a,b,c] = [1,2,3]
如果我不关心第一个元素但我仍然想绑定b
和c
怎么办?我可以使用一些 "wildcard" 来避免给 1
命名吗?
一个可能的解决方案是使用黑洞寄存器:
let [@_,b,c]=[1,2,3]
看来可以多次使用没有问题:
let [@_,@_,c]=[1,2,3]
参见:h "_
。
只需将这些字段分配给一个变量名,以表明您忽略了这些值。 _
变量是一个很好的约定。
let [_, b, c] = [1, 2, 3]
或者,忽略前两项:
let [_, _, c] = [1, 2, 3]
请注意,您可以在 :let-unpack
作业中多次使用它。
在某些语言中,例如 Python,_
变量很特殊,因为对它的赋值不会存储在任何地方。在 Vimscript 中不是这种情况,具有该名称的变量是有效的并且确实存在。但是,如果您从函数内部执行此赋值(很可能是这种情况),则变量范围将限于该函数,并且命名空间污染不应该被关注。
这是真实生活 example usage 来自著名的 vim-figitive plug-in by tpope:
let [_, to, changes; __] = matchlist(a:line, '^ \(.\{-\}\) \+|\zs \(.*\)$')
请注意,它使用 ;
语法忽略从第四个开始的所有字段(这在解包大型列表时很有用。)它使用 _
忽略第一个字段和 __
忽略其余部分。 (请注意,对两者都使用 _
也可以。)
Vim 文档还提到使用 _
作为要忽略的变量的名称。对于 example usage of map()
:
If you do not use "key" you can use a short name:
call map(myDict, {_, val -> 'item: ' . val})
Vimscript 有类似列表解构赋值的东西。例如:
:let [a,b,c] = [1,2,3]
如果我不关心第一个元素但我仍然想绑定b
和c
怎么办?我可以使用一些 "wildcard" 来避免给 1
命名吗?
一个可能的解决方案是使用黑洞寄存器:
let [@_,b,c]=[1,2,3]
看来可以多次使用没有问题:
let [@_,@_,c]=[1,2,3]
参见:h "_
。
只需将这些字段分配给一个变量名,以表明您忽略了这些值。 _
变量是一个很好的约定。
let [_, b, c] = [1, 2, 3]
或者,忽略前两项:
let [_, _, c] = [1, 2, 3]
请注意,您可以在 :let-unpack
作业中多次使用它。
在某些语言中,例如 Python,_
变量很特殊,因为对它的赋值不会存储在任何地方。在 Vimscript 中不是这种情况,具有该名称的变量是有效的并且确实存在。但是,如果您从函数内部执行此赋值(很可能是这种情况),则变量范围将限于该函数,并且命名空间污染不应该被关注。
这是真实生活 example usage 来自著名的 vim-figitive plug-in by tpope:
let [_, to, changes; __] = matchlist(a:line, '^ \(.\{-\}\) \+|\zs \(.*\)$')
请注意,它使用 ;
语法忽略从第四个开始的所有字段(这在解包大型列表时很有用。)它使用 _
忽略第一个字段和 __
忽略其余部分。 (请注意,对两者都使用 _
也可以。)
Vim 文档还提到使用 _
作为要忽略的变量的名称。对于 example usage of map()
:
If you do not use "key" you can use a short name:
call map(myDict, {_, val -> 'item: ' . val})