目前為止我們已經很熟悉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段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?