歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

進行有效編輯的七種習慣

  進行有效編輯的七種習慣 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'')。 關於作者 Bram Moolenaar是Vim的主要作者。他編寫了Vim核心功能,並采納了許多開發者 提供的代碼。他的e-mail地址是:[email protected]




Copyright © Linux教程網 All Rights Reserved