vim-logo.gif當使用 vim 一段時間後,你可能會和我有一樣的想法:最好所有的事情都在 vim 裡面完成。但如果只憑藉前面我們討論過的那些指令或者是設定,還是不夠的。所以今天我們來稍微談一下 vim 的 script,也就是,用 vim 內建的「程式語言」來寫點小程式。

剛好有人問到 vim 可不可以產生一個遞增的數列,像是 01 02 03 04 … 這樣的數列?當然可以,我們還是先把答案寫出來:


:let @a=1
:while @a <=10
: let @b=printf("02d ",@a)
: let @a = @a + 1
: exe "normal a\<C-R>b \<End>\<ESC>"
: endwhile

如果你大概有寫過一些像 shell script 或是 C 語言的話,上面這一串對你來說應該是非常簡單就能夠了解。不過我們還是把一些用法簡單地介紹一下。

應該還記得 @ 就是代表 register 的意思嗎?我們抓了一個 register a 當作一個變數,並且要指定這個變數的值,所以用「:let」


:let @a = 1

同理,vim script 裡面吃四則運算,所以我們這裡因為是遞增數列,所以用


:let @a = @a + 1

而流程控制這裡用的是 while … endwhile 指述。當然 vim 還提供 for , if 這類的東西,你可以用「:h for」來查看詳細的訊息。當中我們用了 printf 來做輸出格式的指定。只是我們另外用了另外一個變數把 printf 的結果吃進來。

接下來就是執行編輯命令,我們用了「:exe」。而這裡因為我們要執行的是編輯的動作,所以用「:normal」然後後面跟上編輯時候的指令。

還記得前面講的呼叫 register 內容的方法嗎?對,就是CTRL+R,但是為了要在程式裡面表示,所以用<C-R>,又為了讓 vim 知道現在輸入的<C-R>代表的是按鍵命令,而不是輸出「<」符號,所以前面再加個「\」。好啦,剩下的只是一些游標控制而已。好啦,我們就完成這個事情了。

如果你覺得在 vim 裡面這樣直接打很麻煩,其實你可以配上我們之前討論過的按鍵設定,搭配 function 的宣告,寫在你的 vimrc 裡面,不過也許有機會我們再來談談 function 的寫法。

雖然這次沒有附圖,但是,一定要自己試玩看看喔!

進一步的訊息可以參考:
:h variable
:h @
:h while
:h let
:h printf