我们对单独的变量进行了很多讨论,但是没有讨论聚合类型的变量。Vim有两种主要的聚合类型的变量,我们现在先看看第一种:列表。
Vimscript列表里都是有序的,混合类型的元素。运行下面的命令:
:echo ['foo','3','bar']
Vim会输出上面的列表。当然,列表也是可以嵌套的,运行下面的命令:
:echo ['foo',[3,'bar']]
Vim也会输出列表。
Vimscript的列表是从零开始索引的,你可以用一般的方法来取得列表里的元素。运行下面的命令:
:echo [0,[1,2]][1]
Vim会输出“[1,2]”。你也可以像Python里面一样从列表的后面开始进行索引。运行下面的命令:
:echo [0,[1,2]][-2]
Vim会输出0。-1索引的是倒数第一个元素,-2索引的是倒数第二个元素。
Vim里的列表是可以被切分的。这个和Python里的也很相似,但是它并不一定每次的表现都是一样的。运行下面的命令:
:echo ['a','b','c','d','e'][0:2]
vim会输出“['a','b','c']”(索引分别为0,1,2的元素)。你也可以超出索引,并且是安全的。运行下面的命令:
: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”。
你可以用+来拼接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函数会倒转给定的列表。