Vim技能修煉教程 14 寫個ex命令吧

2021-10-01 00:01:35 字數 1833 閱讀 2462

我們第二節開始就寫了語法高亮的外掛程式。這一節,我們學習第二種外掛程式的寫法,就是寫個我們自己的ex命令。

自定義ex命令的命令是:command,我們在~/.vim/下建立乙個plugin目錄,然後建立乙個test.vim之類的檔案:

:function hello()

:echom "hello,world!"

:endfunction

:command hello call hello()

首先,我們定義乙個函式。函式名的首字母必須大寫。函式中呼叫:echom去顯示乙個字串。

然後我們通過:command來定義乙個ex命令,命令的作用是去呼叫hello()函式。

有了寫新的ex命令的出口,我們現在終於可以使用vimscript歡快地程式設計啦。

作為最基礎的分支語句,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"都有對就應大小寫敏感和不敏感的版本。

正則匹配也是一樣,"=~"和"!~"也有"=~#"和"=~?"的版本。

在函式中使用引數時,請注意使用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迴圈。

vimscript還支援:while迴圈,例:

:function printstar(arg)

:let l:c = 0

:while l:carg將是列印的行數,我們這麼呼叫:

:call printstar(10)

vimscript中也支援:break退出迴圈和:continue繼續下一次迴圈。

vimscript支援,:try ... :catch ... :finally :endtry的結構。

當然也支援:throw丟擲乙個異常。

try...finally結構,還可以用來處理資源釋放。

Vim技能修煉教程 7 可視模式

可視模式是與正常模式 插入模式一起並列的模式。它的作用就像圖形化編輯器下用滑鼠來選擇乙個塊。在vim下,使用正常模式和ex命令,連搜帶跳行的,未必就比用滑鼠慢。我們先做乙個例子找找感覺,體驗一下vim中可視模式的用法。我們假設這樣一段 include int main int argc,char a...

Vim技能修煉教程 17 編譯自己的Vim

前面我們已經對vim有比較豐富的了解了。我們也知道vim有很多編譯時的選項,很多功能依賴於這些編譯選項。其中最重要的就是指令碼語言的支援,很多發行版本是不全的。為了支援我們所需要的功能,我們需要編譯自己的vim.git clone以ubuntu為例,首先要安裝一些庫的開發包,例 sudo apt g...

Vim技能修煉教程 4 基本功

前面我們學會了外掛程式管理器和如何實現語法高亮,相信大家已經從中體會到了vim外掛程式的強大功能。現在,是時候回來補一補基本功了。vi有三種主要模式,正常模式,插入模式和視覺化模式。正常我們推薦的方式是所有的移動命令只在正常模式下進行,只有在修改的時候再進入插入模式。這個切換是如此頻繁,所以vi提供...