每種編程語言都有產生分支流程的方法,在Vimscript中,這是用`if`語句實現的。?`if`語句是Vimscript中產生分支的基本方法。這里沒有類似Ruby中的`unless`語句, 所以代碼中所有的判斷都需要用`if`實現。
在談論Vim的`if`語句之前,我們需要花費額外的時間講講語法,這樣可以在同一頁里講完它。
## 多行語句
有時你在一行里寫不下所需的Vimscript。在講到自動命令組時,我們已經遇到過這樣的例子了。 這里是我們之前寫過的代碼:
~~~
:augroup testgroup
: autocmd BufWrite * :echom "Baz"
:augroup END
~~~
在理想的情況下,你可以分開成三行來寫。但在手工執行命令的時候,這樣寫就太冗長了。 其實,你可以用管道符(`|`)來隔開每一行。執行下面的命令:
~~~
:echom "foo" | echom "bar"
~~~
Vim會把它當作兩個獨立的命令。如果你看不到兩行輸出,執行`:messages`查看消息日志。
在本書的剩余部分,當你想手工執行一個命令,卻對輸入新行和冒號感到心煩時,試試用管道隔開, 在一行里寫完。
## If的基本用法
現在讓我們回到正題上來,執行下面的命令:
~~~
:if 1
: echom "ONE"
:endif
~~~
Vim將顯示`ONE`,因為整數`1`是"truthy"。現在執行下面命令:
~~~
:if 0
: echom "ZERO"
:endif
~~~
Vim將_不_顯示`ZERO`,因為整數`0`是"falsy"。讓我們看看對字符串是怎么處理的。執行下面命令:
~~~
:if "something"
: echom "INDEED"
:endif
~~~
結果可能讓你吃驚。Vim_不會_把非空字符串當作"truthy",所以什么也沒有顯示。
讓我們打破沙鍋問到底。執行下面的命令:
~~~
:if "9024"
: echom "WHAT?!"
:endif
~~~
這次Vim_會_顯示了!為什么會這樣?
為了搞懂發生了什么,執行下面三個命令:
~~~
:echom "hello" + 10
:echom "10hello" + 10
:echom "hello10" + 10
~~~
第一個命令使得Vim輸出`10`,第二個命令輸出`20`,第三個則又一次輸出`10`!
在探究了所有的命令后,對于Vimscript我們可以得出結論:
* 如有必要,Vim將強制轉換變量(和字面量)的類型。在解析`10 + "20foo"`時,Vim將把`"20foo"`轉換成一個整數(`20`)然后加到`10`上去。
* 以一個數字開頭的字符串會被強制轉換成數字,否則會轉換成`0`
* 在所有的強制轉換完成_后_,當`if`的判斷條件等于非零整數時,Vim會執行`if`語句體。
## Else 和 Elseif
Vim,像Python一樣,支持"else"和"else if"分句。執行下面的命令:
~~~
:if 0
: echom "if"
:elseif "nope!"
: echom "elseif"
:else
: echom "finally!"
:endif
~~~
Vim輸出`finally!`,因為前面的判斷條件都等于0,而0代表falsy。
## 練習
來一杯啤酒,安撫自己因Vim中的字符串強制轉換而受傷的心。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?