Vim技能修煉教程(14) - 寫個ex命令吧
寫個ex命令吧
我們第二節開始就寫了語法高亮的插件。這一節,我們學習第二種插件的寫法,就是寫個我們自己的ex命令。
自定義ex命令的命令是:command,我們在~/.vim/下建立一個plugin目錄,然後創建一個test.vim之類的文件:
:function Hello()
:echom "Hello,World!"
:endfunction
:command Hello call Hello()
首先,我們定義一個函數。函數名的首字母必須大寫。函數中調用:echom去顯示一個字符串。
然後我們通過:command來定義一個ex命令,命令的作用是去調用Hello()函數。
有了寫新的ex命令的出口,我們現在終於可以使用Vimscript歡快地編程啦。
if語句
作為最基礎的分支語句,if將麵臨學習Vimscript中的第一個坑,就是字符串的真假性的問題。
我們看下下麵的例子:
:function Hello()
:if "Hello"
:echom "Hello is true"
:else
:echom "Hello is false"
:endif
:endfunction
我們可以通過:call Hello()來調用它,或者幹脆封裝成一個ex命令。
:command Hello call Hello()
不管如何,輸出結果為:Hello is false。也就是說,Vimscript將"Hello"字符串轉換成了數字0,於是,它是v:false.
字符串比較
另外在比較時需要注意的是字符串比較。在Vim中,"=="比較字符是否大小寫敏感是跟用戶的設置相關的。如果不想受這個影響,建議使用確定的大小寫不敏感比較符"==?"和大小寫敏感比較符"==#"
不光是"==", "!=", ">", "<", ">=", "<=", "is", "isnot"都有對就應大小寫敏感和不敏感的版本。
正則匹配也是一樣,"=~"和"!~"也有"=~#"和"=~?"的版本。
函數
- 定義函數 :function, :endfunction
- 返回值 :return
- 調用函數 :call
在函數中使用參數時,請注意使用a:這個作用域描述符。
另外,與大部分vim命令一樣,函數調用:call命令支持使用範圍來調用。我們看個例子:
:function HelloArgs(arg)
:echom "Hello!" . a:arg
:endfunction
我們輸入:
1,3call HelloArgs(getline("."))
結果為:
Hello!:function HelloArgs(arg)
Hello!:echom "Hello!" . a:arg
Hello!:endfunction
除了通過範圍調用外,函數參數也可以支持不定個數。其實就是以列表方式傳遞參數。
循環結構
上節講列表的時候,我們已經學習了for循環。
while循環
Vimscript還支持:while循環,例:
:function PrintStar(arg)
:let l:c = 0
:while l:c<a:arg
:echo "*"
:let l:c += 1
:endwhile
:endfunction
arg將是打印的行數,我們這麼調用:
:call PrintStar(10)
break和continue
Vimscript中也支持:break退出循環和:continue繼續下一次循環。
異常處理
Vimscript支持,:try ... :catch ... :finally :endtry的結構。
當然也支持:throw拋出一個異常。
try...finally結構,還可以用來處理資源釋放。
最後更新:2017-07-17 19:02:26