VIM進行有效編輯的七種習慣

進行有效編輯的七種習慣
Bram Moolenaar
 
    如果你的很多時間是用來敲純文本,寫程序或HTML,那麼有效地使用一個好的編輯器能節省你不少時間。這篇文章裏的指導和提示將有助於你更快工作,更少犯錯誤。
 
    文中採用開源文本編輯器Vim(Vi IMproved)說明有效編輯的思想,但這些思想也適用於其他編輯器。擇合適的編輯器只是有效編輯的第一步,對於哪個編輯器更好的討論將佔很大地方,這裏就不提了。如果你不知道該用哪個編輯器,或者對現在所使用的不太滿意,不妨試試Vim;你是不會失望的。
 
第一部分:編輯一個文件
快速定位
 
編輯中大部分時間是花費在閱讀、查錯和尋找應該進行編輯的地方上,而不是插入新文字或進行修改。在文件中不斷定位(navigate)是經常要做的,所以最好學會如何快速地進行。
 
你常會搜尋文檔中的一些文字。或者找出包含特定詞或詞組的行。你當然可以使用搜尋命令 /pattern,不過還有更聰明的方法: 
 * 如果你看到一個特定詞,想看看其他地方是不是出現過同樣的詞,可以使用命令,它將對光標所指的詞進行搜尋。
 * 如果設置了 ' incsearch' 選項,Vim將在你正在輸入搜尋模式的時候就
 顯示搜尋的結果(而不是等到你敲了回車之後)。這能夠使你更快地找出拼寫錯誤。
 * 如果設置了 ' hlsearch' 選項,Vim將使用×××背景對搜尋結果進行高亮顯示。你可以對搜尋的結果一目瞭然。應用在程序代碼中可以顯示變量的所有引用。你甚至不需要移動鼠標就能看到所有的搜尋結果。
 
 
 
對於結構化的文檔,快速定位的辦法就更多了。Vim提供專門針對C程序(以及
C++、Java等等)的特殊命令:
 
 * 使用 %可以從開始括號跳到對應的關閉括號。或者從 ``#if'' 跳到對
 應的 ``#endif''。事實上, % 可以完成許多對應項之間的跳轉。可
 以用來檢查if()和{}結構是否平衡。
 * 使用 [{可以在代碼段(block)中跳回到段起始的 ``{``。
 * 使用 gb 可以從引用某個變量的地方跳轉到它的局部聲明。
 
定位的方法當然不止這些。關鍵是你需要知道有這些命令。你也許會說不可能學會所有命令 — Vim裏有成百個定位命令,有的很簡單,有的很聰明 — 這需要幾星期的學習。不過,你不必如此;你只需要瞭解自己的編輯特點,然後掌握相關的定位命令就可以了。
 
可以採取三個基本步驟:
 
 
 1. 在你進行編輯的時候,注意那些重複進行的操作。
 2. 找出能快速進行這些操作的編輯命令。閱讀文檔,問問朋友,或者看看其他人是如何做的。
 3. 進行練習,直到熟練爲止。
 
讓我們通過以下這個例子說明一下:
 1. 你發現在寫C程序時,經常要查找函數定義。你目前使用 * 命令對函數名進行搜尋,但得到的往往是函數的引用而不是函數定義。你覺得一定會有更好的辦法。
 2. 讀過一篇快速參考以後,你發現關於定位標記的說明,裏面說明了如何定位函數定義,這正是你要找的!
 3. 你試着生成了一個標記文件,使用Vim自帶的ctags程序。你學會了使用CTRL-] 命令,發現這省了不少事。爲了更方便,你在 Makefile 里加入了幾行以自動生成標記文件。
 
 
 
當你使用以上三個步驟時,有幾點需要注意的地方:
 
 
 * ``我只想完成任務,不想去讀那些文檔來找新的命令。''。如果你真的是這麼想的,那麼你將永遠停留在計算的石器時代。有些人編寫什麼都用Notepad,卻總不明白爲什麼其他人總能用他一半的時間成任務。
 * 不要過分。如果你總爲一點小事也要去找完美的命令,你就沒法集中精力到你本要完成的任務上了。只要找出那些耗費過多時間的操作,然後使用相關的命令直到熟練就可以了。這以後你就能集中精力到自己的文檔上了。
 
 
 
下面這些章節給出了大多數人遇到的操作。你仿照它們在實際工作中使用三個基本步驟。
 
不要敲兩次
 
我們所使用的字詞集合是有限的。既使是詞組和句子也不過是有限的幾個。對於程序來說更是如此。很明顯,你不想把同樣的東西敲上兩遍。
 
你經常會想把一個詞替換成另一個。如果是全文件替換,你可以使用 :s (substitute)命令。如果只是幾個位置需要被替換,一個快速辦法是使用 * 命令找出下一個詞,使用 cw 來進行替換。然後敲n 找到下個詞,再用 . 重複 cw 命令。
 
. 命令重複上一個改變。這裏的改變是插入、刪除或替換操作。能夠重複進行操作是個極爲強大的機制。如果好好使用它,那麼你大部分的編輯工作可能只不過是敲幾下 . 的事。小心不要在兩次重複之間做其他修改,因爲這將改變你要重複的操作。如果確實需要如此,可以使用 m 命令記住要修改的位置,等重複操作進行完畢之後再回過頭來修改它。
 
有些函數名和變量名可能很難敲。你能準確無誤地輸入``XpmCreatePixmapFromData''麼?Vim的自動補齊機制能給你省不少事。它查看你正在編輯的文件以及#include文件,你可以只敲入``XpmCr'',然後使用CTRL-N 命令讓Vim把它補齊爲``XpmCreatePixmapFromData''。這不但節省了輸入時間,而且減少了輸入的錯誤。
 
如果你有同樣的詞組或句子需要輸入多次,還有個更簡單的辦法。Vim可以進行錄製宏。使用 qa 命令開始在'a'寄存器裏錄製宏。然後正常地輸入編輯命令,最後用 q 退出錄製狀態。如果你想重複所錄製的命令,只需執行 @a 命令。Vim總共提供26個這樣的宏寄存器。
 
使用宏錄製功能可以記錄各種操作,不只限於插入操作。如果你想重複一些東西,不妨一試。
 
需要注意的是記錄的命令會被原封不動地重複執行。在進行定位時簡單的重複宏操作可能不是你想要的結果。比如對於一個詞這裏可能需要左移4個字符,在下個地方可能就要左移5個字符。所以必須定位到合適的位置再重複進行宏操作。
 
如果你要重複的命令很複雜,把它們一次敲進去會很困難。這時你可以寫一個腳本或宏。這常被用於建立代碼模板;比如,一個函數頭。你想做得多聰明就可以做得多聰明。
 
知錯就改
 
編輯時經常會出錯。無人能免。關鍵是快速發現並進行改正。編輯器應該提供這方面的支持,不過你必須告訴它什麼是對什麼是錯。
 
你可能常常會重複同樣的錯誤,你的手指所做的並非是你要它做的。可以使用縮寫(abbreviation)進行修正。下面是一些例子:
 
 
 * :abbr Lunix Linux
 * :abbr accross across
 * :abbr hte the
 
 
這些詞會在編輯時被自動改正。
 
同樣的機制也可以用於對很長的詞語進行縮寫。特別適用於輸入那些你覺得很難
敲的詞,它可以避免出錯。比如:
 
 
 * :abbr pn pinguin
 * :abbr MS Mandrake Software
 
 
但有時候你想要的正是那些縮寫,比如想插入``MS''。所以縮寫中最好使用那些不會出現在文中的詞。
 
Vim提供了一個很聰明的高亮機制,一般用於程序的語法高亮,不過也可以用來查錯。
 
語法高亮會使用顏色顯示註釋。這聽上去不是什麼特別重要的功能,不過一旦用起來就會發現這其實很有用。你能夠快速地發現那些沒有高亮卻本應作爲註釋的文字(可能是因爲忘了敲註釋符)。也可以發現一些被錯誤當成註釋的代碼(可能是因爲忘了敲``*/'')。這些錯誤在黑白方式下是很難被發現的,浪費了不少調試時間。
 
語法高亮也可以用來查找不匹配的括號。一個未被匹配的``)''會被亮紅色背景加以標識。你可以使用 % 命令他們是被如何匹配的,然後把``(''或``)''插入到合適的位置。
 
另一類常犯的錯誤也很容易發現,比如把 ``#include <stdio.h>''敲成了``#included <stdio.h>''。在黑白方式下這是很難發現的,但在語法高亮下則能很快發現``include''能被高亮而``included''沒有。
 
再看一個更復雜的例子:對於英文文本你可以定義一個所要使用的詞的長列表.所有未在表中出現的詞都可能是錯誤,並進行高亮顯示。可以定義幾個用於編輯詞表的宏。這正是字處理器的拼寫檢查功能。Vim中是靠一些腳本來實現的,你也可以對它進行定製:比如,只對註釋中的文字進行拼寫檢查。
 
第二部分:編輯多個文件
 
文件總是成幫結夥
 
人們很少只編輯一個文件。一般需要順序或同時編輯一些相關的文件。你應該利用編輯器使多文件編輯工作更爲高效地。
 
上面提到的標識(tag)機制也支持跨文件搜尋。一般做法是爲項目的所有文件生成標識文件,然後在項目的所有文件中搜尋函數、結構、類型(typedef)等的定義。這比手工搜尋要快捷的多;我瀏覽一個程序要做的第一件事便是建立標識文件。
 
另一個強大的功能是使用 :grep 命令對一組文件進行模式搜尋。Vim把搜尋結果做成一個列表,然後跳到第一個結果。使用 :cn 命令跳到下一個結果。如果你想改變一個函數調用的、參數個數,那麼這個功能會很有用。
 
頭文件裏有很多有用的信息。然而要知道一個聲明出現在哪個頭文件中卻需要花不少時間。Vim能夠理解頭文件,能夠從中找到你需要的東西。把光標移動到函數名下,然後敲 [I:Vim就會顯示出一個頭文件中該函數名的所有匹配。如果你想得到更詳細的結果,可以直接跳到聲明中。一個類似的命令可以用於檢查你所使用的頭文件是否正確。
 
你可以把Vim的編輯區域進行分隔,用來編輯不同的文件。你可以對兩個或多個文件進行比較,或者進行拷貝/粘貼。有許多命令用於打開關閉窗口,文件間跳轉,暫時隱藏文件等等。可以再使用上面提到的三個基本步驟選擇合適的命令進行學習。
 
多窗口還有更多的用法。預覽標識(preview-tag)就是個很好的例子。它打開一個特殊的預覽窗口,光標還保留在你正在編輯的文件中。預覽窗口中可以是光標所指函數的聲明。如果你移動光標到另一個名字下,停留一兩秒,預覽窗口中就會顯示那個名字的定義。名字還可以是頭文件中聲明的結構或函數。
 
讓我們一起來工作
 
編輯器可以編輯文件。e-mail程序可以收發消息。操作系統可以運行程序。每個程序都有它自己的任務,而且應該做好。如果能讓程序一同工作,那麼就會實現很強大的功能。
 
舉個簡單的例子:選擇一個列表中的結構化的文字,並對它進行排序:!sort。這將使用外部命令``sort''來過濾文件。容易吧?排序功能是可以添加到編譯器中的。不過看一下``man sort''就知道它有很多選項。它可能用了一個極爲精巧的排序算法。你還打算把它加到編輯器中麼?更何況還有其他不少過濾程序。編輯器可能會變得很大。
 
Unix精神的一個體現就是提供獨立的程序,各自做好自己的任務,然後組合起來完成更大的任務。不幸的是,許多編輯器不能很好地和其他程序一起工作,比如,你不能包Netscape的郵件編輯器換成其他編輯器。這樣你只能使用那個不順手的程序。另一個趨勢是在編輯器裏提供所有的功能,Emacs就是個代表(有人說Emacs其實是個操作系統,只是可以用來編輯文件)。
 
Vim盡力和其他程序集成,但這需要經過鬥爭。目前Vim已經可以作爲MS-Developer Studio和Sniff的編輯器。一些e-mail程序(比如Mutt)也支持外部編輯器。和Sun Workshop的集成工作正在進行中。總的來說這個領域還有待提高。將來我們會有一個大於其各部分總和的系統。
 
文本結構化
 
你可能經常會遇到有一些結構的文本,這些結構可能同於那些現有命令所支持的結構。這樣你不得不利用那些底層的``磚頭''創建你自己的宏和腳本。這裏說明的就是這類更復雜的東西。
 
有個簡單的辦法可以加速編輯-編譯-修改這個循環。Vim提供 :make 命令,用於進行編譯,並且獲取錯誤輸出,把你帶到發生錯誤的地方進行修正。如果你使用了另一個編譯器,那麼錯誤就無法被Vim獲得。如果不想自己動手,可以修改' errorformat'選項。告訴Vim錯誤是什麼樣子,以及如何從中獲得文件名和行號。它支持複雜的gcc錯誤信息,所以應該也能支持其他編譯器。
 
有時處理一個新的文件類型只需要設置幾個選項或寫一些宏。比如,爲了在man手冊中進行跳轉,你可以寫一個宏獲取光標下的詞,清除緩衝區,然後讀入新的man手冊。這是簡單而高效的參照(cross-reference)方法。
 
使用三個基本步驟,你可以更有效地處理各種結構化文件。只需要想想你想對文件採取的操作,然後找到相應的命令去用就是了。就這麼簡單,你只要去做就成了。
 
第三部分:磨刀
 
養成習慣
 
要學會開車必須下功夫。這是不是你只騎自行車的原因麼?當然不是,你會發現你必須花時間來獲得所需的技術。文本編輯也不例外。你需要學習新的命令,並使用它直至成爲習慣。
 
另一方面,你不應該試圖學習編輯器提供的每個命令。這是徹底的浪費時間。大多數人只需要學習10%到20%的命令就足夠工作了。但是每個人所需要的命令都各不相同。你需要不斷學習,找出那些可以自動完成的重複操作。如果你只做一次操作,而且以後也不會再去做,那麼就不需要進行優化。是如果你發現你在過 去的一小時中重複了好幾遍同樣的操作,那麼就有必要查看一下手冊,看看能否更快速地完成。或者寫一個宏來做。如果是是個不小的任務,比如對一類文本進行對齊,你需要閱讀一下新聞組或看看Internet上是不是有人已經解決了同樣的問題。
 
最根本的步驟是最後的那一個。你可能能夠找到一個重複性的任務,找到一個不錯的作法,可過了一個週末就徹底忘了自己是怎麼做的了。這不成。你必須重複你的作法直到爛熟於胸。只有這時你才真正獲得了你需要的高效。一次不要學得太多。一次只試一些工作得很好的方法。對於那些不常用的技巧,你可能只需要把它記下來,留待以後查閱。總之,如果抱着這樣的目標,你的編輯技能就會更加有效。
 
最後需要指出的是,如果人們忽略了以上幾點會發生什麼:我仍然可以看到有人盯着屏幕看上半天,用兩個指頭敲幾下,然後繼續擡頭看着屏幕,還抱怨自己太累.. 把十個指頭都用上!這不光更快,還不累。每天抽出一個小時練習一下指法,只要幾星期就足夠了。
 
後記
 
書名得益於Stephen R. Covey所著的那本暢銷書《高效人的七種習慣》(``The 7 habits of highly effective people'')。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章