我们讲到的最后一种Vimscript类型将是字典。 Vimscript字典类似于Python中的dict,Ruby中的hash,和Javascript中的object。
字典用花括号创建。值是异质的,但键会被强制转换成字符串。就是这么简单,你没想到吧?
执行这个命令:
:echo {'a': 1, 100: 'foo'}
Vim显示{'a':1,'100':'foo'}
,这说明Vimscript的确把键强制转换为字符串,同时保留值不变。
Vimscript避免了Javascript标准的蠢笨之处,允许你在字典的最后一个元素后留下一个逗号。 (译注:在Javascript的标准中,最后一个元素后面不能留下一个逗号。 但在Firefox里,留下那个逗号是允许的,不过这是Firefox的问题。) 执行下面的命令:
:echo {'a': 1, 100: 'foo',}
Vim再次显示{'a':1,'100':'foo'}
(译注:结尾小逗号不见了)。你应该_总是_在字典里留下一个多余的逗号, _尤其_是当字典的定义跨越多行的时候,这样增加新项的时候将不容易犯错。
查找字典中的一个值的语法跟大多数语言是一样的。执行这个命令:
:echo {'a': 1, 100: 'foo',}['a']
Vim显示1
。试试使用不是字符串的索引:
:echo {'a': 1, 100: 'foo',}[100]
Vim会在查找之前把索引强制转换成字符串,因为键只能是字符串,这么做是合理的。
当键仅由字母,数字和/或下划线组成时,Vimscript也支持Javascript风格的"点"查找。 试试下面的命令:
:echo {'a': 1, 100: 'foo',}.a
:echo {'a': 1, 100: 'foo',}.100
两种情况下,Vim都显示了正确的元素。使用哪种索引字典的方式取决于你自己的偏好。
像对待变量一样赋值给字典中的项,就可以在字典中轻松地添加新的项。
:let foo = {'a': 1}
:let foo.a = 100
:let foo.b = 200
:echo foo
Vim显示{'a': 100, 'b': 200}
。赋值和添加一个新项的方式是一样的。
有两种方法可以移除字典中的项。执行下面的命令:
:let test = remove(foo, 'a')
:unlet foo.b
:echo foo
:echo test
Vim显示{}
和100
。remove
函数将移除给定字典的给定键对应的项,并返回被移除的值。 unlet
命令也能移除字典中的项,只是不返回值。
你不能移除字典中不存在的项。试试执行这个命令:
:unlet foo["asdf"]
Vim抛出一个错误。
选择remove
还是unlet
很大程度上取决于个人偏好。如果非要我说,我推荐使用remove
, 因为它比unlet
更灵活。remove
可以做任何unlet
能做的事,反过来不成立。 所以选择remove
可以一招鲜,吃遍天。
就像列表,Vim有许许多多内置的字典函数。执行下面的命令:
:echom get({'a': 100}, 'a', 'default')
:echom get({'a': 100}, 'b', 'default')
Vim显示100
和default
,如同列表版本的get
函数.
你也可以检查给定字典里是否有给定的键。执行这个命令:
:echom has_key({'a': 100}, 'a')
:echom has_key({'a': 100}, 'b')
Vim显示1
和0
。不要忘了,Vimscript把0
当作假而其他数字则是真。
你可以用items
从一个字典中获取对应的键值对,执行这个命令:
:echo items({'a': 100, 'b': 200})
Vim将显示[['a',100],['b',200]]
这样的嵌套列表。到目前为止,Vimscript字典_不一定_是有序的, 所以不要指望items
的返回结果是有序的!
你可以用keys
返回字典的所有的键和values
返回所有的值。它们的作用一如其名——你可以查一下。
阅读:help Dictionary
。看完它。注意大写D
。
阅读:help get()
.
阅读:help has_key()
.
阅读:help items()
.
阅读:help keys()
.
阅读:help values()
.