學習vi和vim編輯器(11):進階編輯方法(2)
儲存命令:
vi和ex中提供了許多方法來儲存一長串命令序列,這樣當調用已儲存的序列時,只需要輸入幾個字元即可。
單詞縮寫:
可以定義縮寫,讓vi在處於插入模式時替你自動將輸入展開成原文。定義縮寫的命令為:" ab abbr phrase ",其中abbr就是給phrase指定的縮寫。注意,在插入模式中,只有將縮寫當成單個單詞輸入時,縮寫才會被展開,單詞內的abbr不會被展開。如所示,將"vi"定義為"visual editor"的縮寫。
通過" :unab abbr" 來取消一個縮寫的定義,這樣之後再輸入該縮寫時,縮寫將不會被展開。通過" :ab "命令列出當前所有定義的縮寫。
還有一點值得說明,在實際測試時發現,如果縮寫出現在所代表的片語中,該縮寫只會展開一次,並不會無限遞迴展開(但有的版本的vi編輯器可能會無限展開或者縮寫定義失敗)。
使用map命令:
map命令將命令序列“對應”到一個沒有用到的鍵。所以map命令的作用類似於ab命令,但是map命令是對vi的命令模式定義宏,而ab命令是對插入模式定義宏。
:map x sequence:定義字元x映射到sequence命令序列;
:unmap x sequence: 取消字元x所映射的命令;
:map:列出所有被映射的字元;
需要注意的是,最好只對命令模式中沒有用到的鍵做映射。如果對vi中已經使用的按鍵做映射,則該鍵原有的功能就會消失。而在命令模式中沒有用到的按鍵有(不同版本的vi會有所不同):字母鍵:g,K,q;修飾鍵:CTRL+A,CTRL + K,CTRL + O,CTRL + W,CTRL + X;符號:_,*,\與=。
如所示,把交換兩個單詞順序的命令序列映射為" q "(" dw "用於刪除一個單詞," e "移到下一個單詞的結尾," l "往右移動一格," p "放置剛剛刪除的單詞),這樣便可以在編輯會話的任何時候,用q鍵來交換兩個單詞的順序:
保護按鍵免被ex解釋:
在定義映射命令時,某些按鍵並不能直接輸入並把它們作為命令序列的一部分,例如ENTER,ESC,BACKSPACE,DELETE鍵等。如果需要把這些鍵作為命令序列的一部分,需要在前面加上CTRL+V,從而轉換按鍵的正常意義。而且輸入Ctrl+V後,螢幕上顯示的是" ^ "字元,接著輸入enter鍵後,螢幕上顯示的是" ^M "。類似地,退格鍵轉義後顯示為" ^H ",ESC鍵轉義後顯示為" ^[ "。
這種用法可以用在任何ex命令中,而不僅僅是map命令。這就意味著我們可以在縮寫命令或替換命令中輸入分行符號,退格符等。例如,對num定義如下所示的縮寫:
在插入模式中輸入num後,num便會自動延伸為:
還有幾個需要注意的事項:
(1)豎線(|)在ex中具有特殊含義(作為多個ex命令的分隔字元號),所以不能在插入模式的映射鍵中使用豎線。
(2)如果需要將控制字元作為映射字元,例如將" CTRL+A "映射為sequence命令序列,可以使用如下命令 " :map CTRL+A sequence ",但是有三個控制字元必須用" CTRL+V "進行轉義,分別為" CTRL+T ", " CTRL+W ", " CTRL+X "。 因此如果要對" CTRL+T "進行映射,則需要按以下方式輸入":map CTRL+V CTRL+T sequence "。但是實際測試時,並不是這樣,例如可以直接對" CTRL+X "進行映射,前面並不需要進行轉義。反倒是" CTRL+A "要進行轉義,難道書上又講錯了,這裡先記下來吧。
(3)映射序列中可以包含其他映射命令,也就是說允許嵌套映射序列。該功能是由vi編輯器的remap選項控制的,而且該選項預設是開啟的。
映射鍵的範例:
(1)大多數時候我們按" e "鍵將游標移動到單詞結尾是為了在單詞後面新增內容,因此可以做如下映射:
這樣在命令模式中輸入" e "鍵就可以直接移動到單詞結尾並進入插入模式。
(2)儲存一個檔案並編輯下一個檔案:
再次提醒,螢幕上顯示的" ^M "對應的按鍵為:先輸入" CTRL+V ",再輸入" ENTER "。
(3)將C/C++裡的某行代碼進行注釋:
這樣在命令模式中直接輸入g,就能對該行代碼進行注釋。其實方法還有很多,再給出一種用搜尋命令實現的方法:
插入模式中的映射鍵:
一般來說,映射應該只在命令模式中有用,因為在插入模式中輸入某個按鍵就應該代表輸入相應的文本,而不是代表執行相應的命令序列。但是,通過在map命令後面加上驚嘆號(!),即可強制覆蓋按鍵的原有含義,以產生插入模式中的映射行為。
例如前面對" e "鍵進行如下的映射:"map e ea",這樣在命令模式中輸入" e ",就能夠直接將游標移動到單詞尾部並進入插入模式。但是如果在插入模式中使用" e "鍵,就代表輸入字母" e "。如果想在插入模式中達到同樣的效果,需要按以下方式定義:
這樣在插入模式中輸入" e "鍵也能夠將游標移動到當前單詞尾部並仍然保持為插入模式。但這樣就存在一個問題:再也無法輸入文本" e "了。如果想讓字元" e "恢複正常的文本輸入方式,可以使用如下命令:" :unmap! e "(但是實際測試時該命令無法使" e "鍵恢複為輸入文本,難道書上又出錯了?)。
《VI和VIM編輯器》中還介紹了映射功能鍵的相關知識,可以參考《VI和VIM編輯器》p125 http://www.bkjia.com/os/201410/342830.html。
本章vi命令總結:
" :ab "," :unab "," :map "," :unmap ",轉義按鍵" CTRL+V "," :map! "," :unmap! "。