我们讲到的最后一种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()`.
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?