學習vi和vim編輯器(12):進階編輯方法(3)
@功能:
命名緩衝區提供了另一種方法來建立“宏”,即可以將複雜的命令序列儲存到某個命名緩衝區中,再通過@命令執行緩衝區中的內容。舉個例子,首先在插入模式中輸入如下一行:
然後將該行內容刪除並將其儲存到" a "這個命名緩衝區中,之後便可以將游標移動到某個單詞的首部,執行" @a ",就可以將緩衝區中的內容作為命令進行執行。在這個例子中就是將該單詞修改為function,同時仍然處於命令模式。由於@命令會被解釋為vi命令,所以不管緩衝區中儲存的是什麼命令,都可以使用點號(.)來重複這個命令。" @@ "會重複上一個@操作。
使用ex指令碼:
可以將ex命令儲存在" .exrc "檔案中,這樣在開啟vi編輯器時,這些ex命令就會自動執行。或者也可以將ex命令儲存在其他的檔案中,然後在開啟vi編輯器時,通過 " :so scriptname " 讀入該指令檔,從而執行該指令碼。舉個例子," substitute.ex "指令碼有如下內容:
在用vi編輯器開啟某個檔案後,執行如下命令,就可以執行該ex指令碼:
也可以在UNIX命令列中直接將指令碼作用於檔案上,這裡需要用到UNIX的重新導向功能: " ex - filename < scriptname ",這樣便可以將scriptname指令碼作用於filename檔案。例如:
當然我們也可以寫一個shell指令碼,裡麵包含了對ex指令碼的調用,這可以讓我們對檔案做更靈活的修改。例如,在一個shell指令碼中調用 " substitute.ex "指令碼:
here document:
在shell script中,運算子<<表示將以下的行到某個字串為止的內容作為命令的輸入,這也稱為here document。如所示,通過這種文法,可以將ex命令直接寫在shell 指令碼中:
這裡的" end_of_script "字串可以為任一字元串,只要該字串不會出現在輸入文本的其他地方,從而能夠辨別here document結束位置即可。需要說明的是,相比於here document,將編輯命令寫在shell script以外的檔案更具有靈活性。
ex指令碼中的注釋:在ex指令碼中,任何雙引號後的文本在執行時都會被忽略,因此雙引號可以作為注釋的開頭。
除了ex編輯器,UNIX提供了比ex更具有威力的編輯器:sed流編輯器與awk資料操縱語言,這些工具提供了更加強大的編輯功能。當然這是以後的學習方向了,目前還是紮紮實實地學習好vi編輯器。
編輯程式原始碼:
vi編輯器為編程者提供了非常多強大的功能,包括縮排控制,搜尋過程的開始與結束,ctags的使用等。
縮排控制:
如果需要使用vi中的自動縮排,需要設定如下選項:" :set autoindent "。這樣當使用空格或tab鍵做縮排時,後面的行會自動以相同的距離做縮排。而且當你在自動縮排的情況下輸入代碼時,在一行的開頭按下" CTRL+T "會使當前行進入下一層縮排層級,而按下" CTRL+D "則可回到上一層縮排層級。需要注意的是," CTRL+T "和" CTRL+D "是在插入模式中使用的。
" << "與" >> "命令也可以用來對代碼進行縮排。" >> "預設會將代碼往右移動8個空格,而" << "預設將代碼往左移動8個空格。預設移動的空格數可以通過shiftwidth選項進行改變,例如通過" :set shitwidth=4 "將移動的空格數設定為4。而且可以同時移動多行,只需要在"<< "或" >> "前面加上數值即可。
當我們對代碼進行縮排時,由於tab鍵,空格鍵在螢幕上都是顯示空白,而且也不容易看出行結尾是否有空格,此時可以通過list選項來改變顯示的狀態,這個選項之前的文章已經講過了。或者通過" :l "命令也能達到同樣的效果。
一個特殊的搜尋命令:
" ( ,[,{,< "都可以稱為開括弧,當游標位於任何一種開括弧上時,按下" % "鍵,可以將游標移動到成對的閉括弧上。同樣地,當游標位於某一個閉括弧上時,按下" % "鍵可以回到相應的開括弧上。當游標不是位於括弧字元上時,按下" % "鍵後,vi會在當前這一行尋找第一個開或閉括弧,再將游標移動到該括弧相對應的括弧上。
使用標籤(tag):
UNIX上的ctags命令可以產生一個資訊檔,vi編輯器可以用該檔案判斷各個源檔案中分別定義了哪些函數。預設情況下,這個資訊檔的檔案名稱為tags。將UNIX中的" ctags "命令和vi中的" :tag "命令結合起來使用,可以將游標快速移動到某個標籤上。首先在UNIX命令列上用" ctags "命令為程式源檔案建立相應的tags檔案,然後在vi編輯器中用" :tag name "命令將游標移動到name函數所在的行。
在命令模式下,可以將游標移到要尋找的標識符上,再輸入" CTRL+[ ",也能夠將游標移動到標識符所在的行。需要注意,vi尋找的是以當前游標所在位置為起點的單詞,而不是包含該游標的那個完整單詞。而且如果尋找的標籤位於新的檔案中,但是當前檔案還沒有儲存,vi不會讓你讀入新的檔案。此時必須先用" :w "命令儲存當前檔案,或者也可以通過 ":tag! name"來強制讓vi放棄編輯結果。
關於ctags命令後續文章還將繼續學習,這裡只是學習ctags的簡單用法。
本章vi命令總結:
" @ "," @@ "," CTRL + T "," CTRL + D "," << "," >> "," :l "," % "," :tag name "," CTRL + [ "," :tag! name "。