到目前為止我們已經講完了單行命令。在本書后面的三分之一個章節中將會把Vim腳本當作一個_腳本語言_。這部分東西不會像前面的你學到的東西一樣馬上可以學以致用,不過這是為本書的最后一部分打基礎,最后一部分會講解創建一個插件所需要的各個方面的東西。
我們開始吧。我們首先要了解的是變量。執行下面的命令。
~~~
:let foo = "bar"
:echo foo
~~~
Vim會顯示`bar`。`foo`現在是一個變量,我們將一個字符串`"bar"`賦值給它。現在執行這些命令:
~~~
:let foo = 42
:echo foo
~~~
Vim會顯示`42`,因為我們將`foo`賦值為整型`42`。
從這些小例子似乎可以看出Vim腳本是動態類型的。事實并非如此,我們之后會說明。
## 作為變量的選項
你可以通過一種特殊語法將_選項_作為變量來設置。執行下面的命令:
~~~
:set textwidth=80
:echo &textwidth
~~~
Vim會顯示`80`。在名稱的前面加一個`&`符號是告訴Vim你正在引用這個選項,而不是在使用一個名稱剛好相同的變量。
我們來看下Vim是怎么處理布爾選項的。執行下面的命令:
~~~
:set nowrap
:echo &wrap
~~~
Vim顯示`0`。然后再試試這些選項:
~~~
:set wrap
:echo &wrap
~~~
這次Vim會顯示`1`。這些輸出很明確提示Vim會將整型`0`當作"false",整型`1`當作"true"。我們可以更進一步假設Vim會將所有的非0值整型當作"truthy",而事實確實如此。
我們也可以使用`let`命令來_設置_作為變量的選項。執行下面的命令:
~~~
:let &textwidth = 100
:set textwidth?
~~~
Vim會顯示`textwidth=100`。
既然`set`可以搞定選項的設置,那我們為什么還要用`let`呢?執行下面的命令:
~~~
:let &textwidth = &textwidth + 10
:set textwidth?
~~~
這一次Vim顯示`textwidth=110`。當你用`set`來設置某個選項,你只能給它設置一個常量值。當你使用`let`并將它作為一個變量來設置,你可以使用Vim腳本的所有強大之處來決定它的值。
## 本地選項
如果你想將某個選項作為變量來設置它的_本地_值,而不是_全局_值,你需要在變量名前面加前綴。
在兩個分隔的窗口中分別打開兩個文件。執行下面的命令:
~~~
:let &l:number = 1
~~~
然后切換到另一文件,然后再執行下面的命令:
~~~
:let &l:number = 0
~~~
注意第一個窗口會出現行號,而第二個沒有。
## 作為變量的寄存器(Register)
你也可以將_寄存器_當作變量來讀取和設置。執行下面的命令:
~~~
:let @a = "hello!"
~~~
現在把光標放到文本中的某個地方然后敲擊`"ap`。這個命令會告訴Vim“在這里粘貼寄存器`a`中的內容”。我們設置了這個寄存器的內容,所以Vim會將`hello!`粘貼到你的文本中。
還可以讀寄存器的內容。執行下面的命令:
~~~
:echo @a
~~~
Vim會輸出`hello!`。
在你的文件中選擇一個單詞然后用`y`復制,再執行下面的命令:
~~~
:echo @"
~~~
Vim會輸出你剛才復制的單詞。`"`寄存器是“未命名(unnamed)”寄存器,在復制的時候沒有指定寄存器的文本都會放到這里。
在你的文件中執行搜索`/someword`,然后執行下面的命令:
~~~
:echo @/
~~~
Vim會輸出你剛剛使用的搜索模式。這樣你就可以通過編程來讀_和修改_當前的搜索模式,有些時候這會很有用。
## 練習
檢查你的`~/.vimrc`文件,然后將其中的一些`set`和`setlocal`命令替換為它們的`let`形式。記住布爾選項仍然需要被設置為某個值。
嘗試將某個布爾選項設置為0和1之外的值,例如`wrap`。當你將它設置為一個不同的數字時會怎么樣?如果設置為字符串又會是什么情況?
回到你的`~/.vimrc`文件,然后恢復所有的修改。在`set`可以搞定的時候,永遠都不要用`let`,這是因為`let`更難于閱讀。
閱讀`:help registers`,然后看看你可以進行讀和寫的寄存器列表。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?