vim script简介

13 . V im script 簡介

原始的 vi 本就有一些簡單的 macro 語法,可以設定一些複雜的編輯動作於一個指令,等於是在創造一個新的指令。V im 則更進一步把他發展成程式語言。在 V im 中,一般的設定檔,如 vimrc 及一些 syntax/plugin 檔,都是由 V im script 寫成的。可以設定變數,也有迴圈、條件判斷及內建函數可以使用,更可以自訂函數,儼然就是一個程式語言雛形了。當然,原始的 vi macro 語法還是認得的,這點不必擔心。

由於 V im script 的大大擴充,雖然說是簡介,但內容可能會比其他的章節多,而且可能會比較深入一些,可以視情形,撿幾個順手的例子來用,不必一開始就要通通搞懂他。:-)

 

13 .1 一些簡單的 macro

這裡指的 macro 是一般的鍵盤對應、縮寫設定及簡單的新命令定義,雖然也是會使用到 V im script,但由於並不是完整的規劃、設計,因此就以 macro 為名來代表(當然,實質上也是利用 V im script 來書寫的)。

 

13 .1 .1 按鍵對應

V im 可以將多個動作(命令或是函數)對應給一個簡單的按鍵,這樣一來就可以很方便的按個鍵去執行所定義的動作,基本的例子就是第 9.7 節,頁 [*] 的一些實際例子。由於 V im 預設已經內建把 F1 鍵定義給線上求助檔,因此,這個鍵就不要去麻煩他了。

 

13 .1 .1 .1 一些按鍵的書寫方法

在傳統的按鍵對應,有他的簡單書寫方法,但通常並不是很直覺,V im 則改進了書寫方法,可以很直覺的書寫。以下是一些例子:

<Esc >Esc 鍵。
<Tab >Tab 鍵。
<Home >Home 鍵。
<Del >Del 鍵。
<CR >Enter 鍵。
<Enter >Enter 鍵,和上面的相同。
<LT >就是 <,在和 < 字元本身會有混淆、疑義時使用。也可以使用 /<。
<BS >Backspace 倒退鍵。
<Up >PageUp 向上翻頁鍵。
<F5 >F5 功能鍵。
<C-G >Ctrl+G 鍵。

要注意的是,大小寫是不分的,以上的書寫只是為了閱讀方便而已。詳細的按鍵符號,這裡就不多說明了,有需要的話,可以進入 vim:h key-notation ,就會有詳細的列表。

/< 的使用只能在 cpoptions 設定項不含 B 旗標時才能使用,通常 B 旗標預設是會有的,請 :set cpoptiions? 就可知道目前的設定。

要非常小心的是,這種直覺的書寫方式,不能用於 :set 及 :autocmd 的情形,因為角括號在裡頭有其他的特殊意義。通常,這只能用於按鍵的對應,縮寫及選單設定的情況。

 

13 .1 .1 .2 map 指令的種類

V im 除了原始的 map[!] 外,擴充了相當多的類似 map 指令。各在不同的模式作用。map 主要是作用於常態模式及反白模式,而 map! 則是作用於插入模式及命令列模式。

v map僅在反白模式時作用,Visual mode。
n map僅在常態模式時作用,Normal mode。
i map僅在插入模式時作用,Insert mode。
o map僅在操作等待模式時作用,Operator-pending mode。
c map僅在命令列模式時作用,Command-line mode。

[實例] :map <F5> bi{<Esc>ea}<Esc>
這樣一來,只要在英文單字任意處按 F5 ,這個英文單字的前後就會加上大括號。

說明如下:

bi {<Esc>按 b 移至英文單字的第一個字母處,並按 i 進入插入模式,寫入 { 這個字元,並按 Esc 鍵,回復常態模式。
e 移動至這個英文單字的最後一個字母處。
a }<Esc>進入插入 append 模式,並輸入 } 這個字元,再回到常態模式。

需注意的是,在命令列模式前頭會有個冒號,因為在 vim 裡頭,要按個冒號才會進入命令列模式。但如果是設在 V im script 檔裡頭當然就沒有冒號了。以上的例子也是可以對應至一些較容易記憶的按鍵,例如:

 

map ,b bi{<Esc>ea}<Esc>

這樣按 ``,b'' 就會有同樣的作用,但 ``,'' 及 ``b'' 之間不能相隔太久的時間,這樣 V im 才會知道這兩個按鍵是結合在一起的13 .1 。而 b 在此就代表 braces(大括號)。

如果要知道目前的按鍵對應的情形,可 :map 就會列出所有的目前按鍵對應,前面標示的記踸就是各種模式的代表字母,例如 n 代表 normal,i 代表 insert。

 

13 .1 .1 .3 防止重複對應

為了防止重複對應到已有定義的按鍵,通常指令內可加入 nore 的字樣,例如:

:noremap  => Normal, Visual and Operator-pending
:vnoremap => Visual
:nnoremap => Normal
:onoremap => Operator-pending
:noremap! => Insert and Command-line
:inoremap => Insert
:cnoremap => Command-line

其實其他對應性質的指令也是會有類似的這種指令,請參考下一節。

 

13 .1 .2 縮寫對應

縮寫對應是把一長串的字串對應到簡單的幾個代表性字串。縮寫的對應只能用在插入模式、取代模式及命令列模式。主要用於輸入時節省時間及避免拼錯。這裡利用例子來做說明:

[實例] :ab gl GNU Linux
把 gl 這個按鍵對應成 GNU Linux。

ab 是 abbreviate 的縮寫,這樣一來,在插入模式時,只要輸入 gl,再按 Sapce 鍵或 Ctril+] ,這個 gl 就會變成 GNU Linux 這個字串。SapceCtril+] 的區別在於前者會多留個空白,方便繼續輸入其他文字;而後者則不會多留個空白。 要注意的是,這在取代模式(請參考第 3.1.2 節,頁 [*] )、命令列模式(請參考第 1.4 節,頁 [*] )也是可以作用,如果是使用 :ia[bbrev] ,那只會在插入模式及取代模式有作用。

以下是一些常會用到的指令:

:ab[breviate] 不接任何參數,這會列出目前所有的縮寫對應。其中標有 `i' 的,代表作用於插入模式;標有 `c' 的,代表作用於命令列模式;標有 `!' 的,則兩種模式皆有作用。
:ab gl 這會列出 gl 是對應成什麼字串。
:una[bbreviate] gl 取消 gl 這個對應。
:ia[bbrev] :ab 的定義一樣,但只作用於插入模式。
:cb[bbrev] :ab 的定義一樣,但只作用於命令列模式。
:norea[bbrev] 用於防止重對應已有對應的字串。
:abc[lear] 取消所有由 :ab 所定義的對應。
:iabc[lear] 取消所有由 :ia 所定義的對應。
:cabc[lear] 取消所有由 :ca 所定義的對應。

 

13 .1 .3 定義新命令

V im 提供自行定義新命令的方法,其語法是:

:com[mand][!] [屬性……] 新命令名 動作

屬性的部份較複雜,在此先省略不談,底下再來詳細說明。其中 `!' 代表強制定義已有的命令,否則已存在的命令是不允許重定義的。新命令名也是有限制:

(1) 必需以大寫英文字母開頭。
(2) 不能使用 :X,:Next,:Print,這三個保留字。
(3) 其他的部份,可以是字母或數字,分大小寫,但不能使用底線。
但不建議使用數目字。

通常此類新命令的定義是使用在 V im script 的場合。

 

13 .1 .4 新命令的屬性

V im 會把這些命令當成是 ex 命令一般的地位。這裡的所謂屬性指的是新命令所能使用的參數及是否可以指定範圍等等。這裡分成四個部份來說明:參數、補全動作、範圍指定及特殊情形。

 

13 .1 .4 .1 參數

新命令可以使用 -nargs 屬性來指定參數的性質。

-nargs=0  這是預設,就是沒有參數,可以省略不寫。
-nargs=1 需要一個參數。
-nargs=* 是否有參數及參數數目不拘。
-nargs=? 允許零或一個參數。
-nargs=+ 必須有參數,但參數數目不拘。

參數之間以空白或 Tab 區隔。實際上定義時,置放參數的位置是以 <args> 來代表的。

<args>   一般使用,但參數內無法使用雙引號。
<q-args> 和 <args> 同,但可以使用雙引號。
<f-args> 用於函數內所要用到的參數。

 

13 .2 V im script 的語法

V im script 只有兩種資料型態,數字及字串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值