我們講到的最后一種Vimscript類型將是字典。 Vimscript字典類似于Python中的dict,Ruby中的hash,和Javascript中的object。
字典用花括號創建。值是異質的,但_鍵會被強制轉換成字符串_。就是這么簡單,你沒想到吧?
執行這個命令:
~~~
:echo {'a': 1, 100: 'foo'}
~~~
Vim顯示`{'a':1,'100':'foo'}`,這說明Vimscript的確把鍵強制轉換為字符串,同時保留值不變。
Vimscript避免了Javascript標準的蠢笨之處,允許你在字典的最后一個元素后留下一個逗號。 (譯注:在Javascript的標準中,最后一個元素后面不能留下一個逗號。 但在Firefox里,留下那個逗號是允許的,不過這是Firefox的問題。) 執行下面的命令:
~~~
:echo {'a': 1, 100: 'foo',}
~~~
Vim再次顯示`{'a':1,'100':'foo'}`(譯注:結尾小逗號不見了)。你應該_總是_在字典里留下一個多余的逗號,?_尤其_是當字典的定義跨越多行的時候,這樣增加新項的時候將不容易犯錯。
## 索引
查找字典中的一個值的語法跟大多數語言是一樣的。執行這個命令:
~~~
:echo {'a': 1, 100: 'foo',}['a']
~~~
Vim顯示`1`。試試使用不是字符串的索引:
~~~
:echo {'a': 1, 100: 'foo',}[100]
~~~
Vim會在查找之前把索引強制轉換成字符串,因為鍵只能是字符串,這么做是合理的。
當鍵僅由字母,數字和/或下劃線組成時,Vimscript也支持Javascript風格的"點"查找。 試試下面的命令:
~~~
:echo {'a': 1, 100: 'foo',}.a
:echo {'a': 1, 100: 'foo',}.100
~~~
兩種情況下,Vim都顯示了正確的元素。使用哪種索引字典的方式取決于你自己的偏好。
## 賦值和添加
像對待變量一樣賦值給字典中的項,就可以在字典中輕松地添加新的項。
~~~
:let foo = {'a': 1}
:let foo.a = 100
:let foo.b = 200
:echo foo
~~~
Vim顯示`{'a': 100, 'b': 200}`。賦值和添加一個新項的方式是一樣的。
## 移除項
有兩種方法可以移除字典中的項。執行下面的命令:
~~~
:let test = remove(foo, 'a')
:unlet foo.b
:echo foo
:echo test
~~~
Vim顯示`{}`和`100`。`remove`函數將移除給定字典的給定鍵對應的項,并返回被移除的值。?`unlet`命令也能移除字典中的項,只是不返回值。
你不能移除字典中不存在的項。試試執行這個命令:
~~~
:unlet foo["asdf"]
~~~
Vim拋出一個錯誤。
選擇`remove`還是`unlet`很大程度上取決于個人偏好。如果非要我說,我推薦使用`remove`, 因為它比`unlet`更靈活。`remove`可以做任何`unlet`能做的事,反過來不成立。 所以選擇`remove`可以一招鮮,吃遍天。
## 字典函數
就像列表,Vim有許許多多內置的字典函數。執行下面的命令:
~~~
:echom get({'a': 100}, 'a', 'default')
:echom get({'a': 100}, 'b', 'default')
~~~
Vim顯示`100`和`default`,如同列表版本的`get`函數.
你也可以檢查給定字典里是否有給定的鍵。執行這個命令:
~~~
:echom has_key({'a': 100}, 'a')
:echom has_key({'a': 100}, 'b')
~~~
Vim顯示`1`和`0`。不要忘了,Vimscript把`0`當作假而其他數字則是真。
你可以用`items`從一個字典中獲取對應的鍵值對,執行這個命令:
~~~
:echo items({'a': 100, 'b': 200})
~~~
Vim將顯示`[['a',100],['b',200]]`這樣的嵌套列表。到目前為止,Vimscript字典_不一定_是有序的, 所以不要指望`items`的返回結果是有序的!
你可以用`keys`返回字典的所有的鍵和`values`返回所有的值。它們的作用一如其名——你可以查一下。
## 練習
閱讀`:help Dictionary`。看完它。注意大寫`D`。
閱讀`:help get()`.
閱讀`:help has_key()`.
閱讀`:help items()`.
閱讀`:help keys()`.
閱讀`:help values()`.
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?