Vimscript编程指南

列表

我们对单独的变量进行了很多讨论,但是没有讨论聚合类型的变量。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函数会倒转给定的列表。

练习

  • 阅读 :help List.阅读所有的内容,注意大写的L。
  • 阅读 :help add().
  • 阅读 :help len().
  • 阅读 :help get().
  • 阅读 :help index().
  • 阅读 :help join().
  • 阅读 :help reverse().
  • 浏览 :help functions ,看看那些本章没有提到的list操作的函数。 运行:match Keyword /\clist/ 来高亮小写的list,以便于找到要看的内容。