Vim中有两种可以存放元素的集合(容器),列表和字典。
List
列表(List)在Vim中是有序的,可以混合存放不同元素的集合。
1 |
:echo ['foo', 3, 'bar'] |
List是从下标0
开始索引的,-1
可以表示最后一个元素,-2
表示倒数第二个元素。
1 2 3 |
:echo [0, [1, 2]][1] :echo [0, [1, 2]][-2] |
Vim的list支持切片操作(类似Python),包含头也包含尾。
1 2 3 4 5 6 7 8 9 10 11 |
:echo ['a', 'b', 'c', 'd', 'e'][0:2] " ['a', 'b', 'c'] :echo ['a', 'b', 'c', 'd', 'e'][0:100000] " 整个list :echo ['a', 'b', 'c', 'd', 'e'][-2:-1] ['d', 'e'] :echo ['a', 'b', 'c', 'd', 'e'][:1] " ['a', 'b'] :echo ['a', 'b', 'c', 'd', 'e'][3:] " ['d', 'e'] |
类似Python一样,VimScript可以对String进行切片。
1 2 |
:echo "abcd"[0:2] " abc |
可以使用+连接两个list。
1 2 |
:echo ['a', 'b'] + ['c'] " ['a', 'b', 'c'] |
List的默认方法
List有很多build-in functions。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
:let foo = ['a'] :call add(foo, 'b') :echo foo " ['a', 'b'] :echo len(foo) " 2 :echo get(foo, 0, 'default') " a :echo get(foo, 100, 'default') " default :echo index(foo, 'b') " 1 :echo index(foo, 'nope') " -1 :echo join(foo) :echo join(foo, '---') :echo join([1, 2, 3], '') " Vim displays a b, a---b, and 123. :call reverse(foo) :echo foo :call reverse(foo) :echo foo " ['b', 'a'] and then ['a', 'b'] |
Dcitionaries
VimScript的字典(Dictionares)和Python的Dict,Ruby的hashes,JavaScript的objects很像。
字典用花括号表示,value可以是任意类型,但是key必须是strings
。
1 2 |
:echo {'a': 1, 100: 'foo'} " {'a': 1, '100': 'foo'} |
Vim可以处理字典最后的逗号,因此我们最好永远在字典的最后加一个逗号,尤其是在多行字典的时候,这样添加新的键值对不容易出错。
1 2 |
:echo {'a': 1, 100: 'foo',} " {'a': 1, '100': 'foo'} |
取出字典值的方式和其他的编程语言一样。如果下表不是string
的话,会先转换成string
。
1 2 3 4 |
:echo {'a': 1, 100: 'foo',}['a'] " 1 :echo {'a': 1, 100: 'foo',}[100] " foo |
也可以使用点号。
1 2 |
:echo {'a': 1, 100: 'foo',}.a :echo {'a': 1, 100: 'foo',}.100 |
添加新的key-value也和其他语言一样。
1 2 3 4 5 |
:let foo = {'a': 1} :let foo.a = 100 :let foo.b = 200 :echo foo " {'a': 100, 'b': 200} |
remove函数可以删除某个键值对,并且返回被删除的值。unlet
与它的功能一样,只是没有返回值。如果试图删除一个不存在的值,会发生错误。
1 2 3 4 5 6 |
:let test = remove(foo, 'a') :unlet foo.b :echo foo :echo test " {}, 100 |
字典有以下build-in functions,关于功能,请阅读:help
.
- get()
- has_key()
- items()
- keys()
- values()