在 Vimscript 中,如何从列表中跳过解构赋值中的元素?

In Vimscript, how to skip over elements in a destructuring assignment from a list?

Vimscript 有类似列表解构赋值的东西。例如:

:let [a,b,c] = [1,2,3]

如果我不关心第一个元素但我仍然想绑定bc怎么办?我可以使用一些 "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})