目前为止我们已经很熟悉Vimscript里的变量类型了,但我们压根还没讲到集合(aggregates)呢! Vim有两种主要的集合类型,现在我们将讲到第一种:列表。
Vimscript列表是有序的,异质的元素集合。执行下面的命令:
~~~
:echo ['foo', 3, 'bar']
~~~
Vim输出这个列表。列表里当然可以嵌套列表。执行下面的命令:
~~~
:echo ['foo', [3, 'bar']]
~~~
Vim会愉快地输出这个列表。
## 索引
Vimscript列表的索引从0开始,你可以用下标得到对应元素。执行这个命令:
~~~
:echo [0, [1, 2]][1]
~~~
Vim显示`[1,2]`。你也可以从列表结尾进行索引,这很像Python。执行这个命令:
~~~
:echo [0, [1, 2]][-2]
~~~
Vim显示`0`。索引`-1`对应列表的最后一个元素,`-2`对应倒数第二个,以此类推。
## 切割
Vim列表也可被切割。这_看上去_会让Python程序员感到眼熟,但它_不_总是表现得跟Python中的一样! 执行这个命令:
~~~
:echo ['a', 'b', 'c', 'd', 'e'][0:2]
~~~
Vim显示`['a','b','c']`(第1,2,3个元素)。越过列表索引上界也是安全的。试试这个命令:
~~~
:echo ['a', 'b', 'c', 'd', 'e'][0:100000]
~~~
Vim仅仅显示整个列表。
可以用负数切割。试试这个命令:
~~~
:echo ['a', 'b', 'c', 'd', 'e'][-2:-1]
~~~
Vim显示`['d','e']`(元素-2和-1)。
你可以忽略第一个索引以表示"开头"和/或最后一个索引以表示"结尾"。执行下面的命令:
~~~
:echo ['a', 'b', 'c', 'd', 'e'][:1]
:echo ['a', 'b', 'c', 'd', 'e'][3:]
~~~
Vim显示`['a','b']`和`['d','e']`。
像Python,Vimscript也允许你索引和切割字符串。执行下面命令:
~~~
:echo "abcd"[0:2]
~~~
Vim显示`abc`。可是,你不能使用负数来索引字符串。你却_可以_使用负数切割字符串! 执行下面的命令:
~~~
:echo "abcd"[-1] . "abcd"[-2:]
~~~
Vim显示`cd`(使用负数索引会没有报错地得到一个空字符串)。
## 连接
你可以用`+`连接Vim列表。试试这个命令:
~~~
:echo ['a', 'b'] + ['c']
~~~
Vim,一点也不奇怪地,显示`['a','b','c']`。 没什么好说的——在奇怪的Vimscript世界里,列表是如此地正常,以至于让人感到奇怪。
## 列表函数
Vim有着许许多多内置列表函数。执行这个命令:
~~~
:let foo = ['a']
:call add(foo, 'b')
:echo foo
~~~
Vim就地在列表`foo`末尾加上`'b'`,并显示`['a','b']`。
~~~
:echo len(foo)
~~~
Vim显示`2`,即是列表的长度。试试下面的命令:
~~~
:echo get(foo, 0, 'default')
:echo get(foo, 100, 'default')
~~~
Vim显示`a`和`default`。`get`函数会返回给定索引对应的给定列表的项,如果索引超过列表范围, 返回给定的默认值。
执行这个命令:
~~~
:echo index(foo, 'b')
:echo index(foo, 'nope')
~~~
Vim显示`1`和`-1`。`index`函数返回给定项在给定列表的第一个索引,如果不在列表中则返回`-1`。
现在执行这个命令:
~~~
:echo join(foo)
:echo join(foo, '---')
:echo join([1, 2, 3], '')
~~~
Vim显示`a b`,`a---b`,和`123`。`join`先将给定列表的每一项强制转换成字符串, 再以给定的分割字符串(或一个空格,如果没有给的话)作为分割,连接成一个字符串。
执行下面命令:
~~~
:call reverse(foo)
:echo foo
:call reverse(foo)
:echo foo
~~~
Vim先显示`['b','a']`,接着是`['a','b']`。`reverse`_就地_转置给定的列表。
## 练习
阅读`:help List`。看完它。注意大写`L`。
阅读`:help add()`.
阅读`:help len()`.
阅读`:help get()`.
阅读`:help index()`.
阅读`:help join()`.
阅读`:help reverse()`.
浏览`:help functions`来查找我没有讲过的其他列表函数。 执行`:match Keyword /\clist/`来以大小写不敏感的方式高亮单词`list`,以便于你的查找。
- 前言
- 鸣谢
- 预备知识
- 打印信息
- 设置选项
- 基本映射
- 模式映射
- 精确映射
- Leaders
- 编辑你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 锻炼你的手指
- 本地缓冲区的选项设置和映射
- 自动命令
- 本地缓冲区缩写
- 自动命令组
- Operator-Pending映射
- 更多Operator-Pending映射
- 状态条
- 负责任的编码
- 变量
- 变量作用域
- 条件语句
- 比较
- 函数
- 函数参数
- 数字
- 字符串
- 字符串函数
- Execute命令
- Normal命令
- 执行normal!
- 基本的正则表达式
- 实例研究:Grep 运算符(Operator),第一部分
- 实例研究:Grep运算符(Operator),第二部分
- 实例研究:Grep运算符(Operator),第三部分
- 列表
- 循环
- 字典
- 切换
- 函数式编程
- 路径
- 创建一个完整的插件
- 旧社会下的插件配置方式
- 新希望:用Pathogen配置插件
- 检测文件类型
- 基本语法高亮
- 高级语法高亮
- 更高级的语法高亮
- 基本折叠
- 高级折叠
- 段移动原理
- Potion段移动
- 外部命令
- 自动加载
- 文档
- 发布
- 还剩下什么?