閱讀436 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go  10分鍾教你使用阿裏雲API
  下一篇:go  阿裏巴巴創新研究計劃正式發布 麵向全球招募前沿技術合作者