使用VIM編輯C程序

使用VIM編輯C程序
Siddharth Heroor

 

譯:mingleiChen


修訂歷史
修訂版v1.0 Jan 14, 2001 Revised by: sh
第二版,修正了一下排版錯誤
修訂版v0.1 Dec 04, 2000 Revised by: sh
第一版,我很願意聽到你的反饋
本文對使用Vim進行編輯C或其他語言(如C++、JAVA)的程序做了簡單的介紹。
內容
1.介紹
2.範圍內移動(Moving around)
2.1 w,e,b按鍵
2.2 {,},[[,]]按鍵
2.3 %按鍵
3.在C文件中任意跳轉
3.1 ctags
3.2 marks
3.3 gd按鍵
4.自動單詞完成
5.自動格式化
5.1 限制列寬
5.2 自動匹配代碼
5.3 註釋
6.多文件編輯
7.快速修正
8.版權
9.參考

1.介紹
        本文檔的目的是爲VIM的新手用戶編輯C語言文件提供可行的編輯選項.文檔介紹了一些常用的命令和按鍵,它們能夠有效的提高程序員書寫C源代碼的速 度.
        文檔主要描述瞭如何使用VIM編輯C語言文件.本文描述的大部分內容同樣適用於vi,此外,文中談到的關於編輯C文件的內容或多或少的適用於 C++,JAVA及其他相似的語言.
2.Moving around
2.1 按鍵w,e,b
        用戶可以使用w,e,b鍵在文件中移動.VIM可以識別C表達式中的不同符號.
        看看下面的C代碼:

圖1

 

 

        假設光標處於if語句的開始處,當按下w鍵,光標將跳至第一個(.再按一次w,光標將跳至NULL.再按將跳至==,接下來的按鍵會分別帶你到 x..)... &&... y... >... z... 最後到)...
        按鍵e的作用與w相似,只是它會帶你到當前單詞的末尾,而不是下個單詞的開始處.
        而按鍵b的功能與w完全相反,當你按下它,它從相反的方向開始移動光標.如上例, 將)...z...>...y...&&...)...x..最後是(...
2.2 按鍵{,},[[,]]
        {和}用於在文檔中的段落間移動.當編輯C程序時,這些按鍵表現出些許不同的含義.下面是一段程序,包含了幾個空行.例如:

 

圖2

 

 

        上面的片斷顯示了兩個段落,用戶通過使用{和}鍵能夠很容易的從一段開始移至另一個開始。{將帶領光標至段首,而}則把光標移至段尾。許多人喜歡這 樣的編碼樣式,把邏輯上的一組語句組織成段,然後使用空行分割它們。例如:

 

圖3

 

 

        在這樣的場合,{和}顯得非常有用。用戶很輕鬆的就可以從‘一段’移至另一段。 另一種有用的按鍵是[[和]],這一對按鍵將把你的光標帶至{之前或是}之後的第一列。例如:

 

圖4

 

 

        假設你正在編輯函數foo(),突然你想轉去編輯bar(),這時只需按]],光標會帶你到函數bar()的第一個{處。用戶可以按[[回到 foo()的開始。
        其他相似的按鍵集是][和[],][將把光標帶至下一個位於第一列的}。例如你在編寫foo()時需要轉到foo()的結尾,這時只需要按][就可 以做到。類似的,在你編寫bar()的時候若需要移到foo()的結尾,按[]可以幫你做到這點。
記住這些按鍵的使用方法可以這樣做,第一個按鍵指示了它將把光標向上移還是向下移。[向上移而]向下移。第二個按鍵則表示將匹配那個符號。類似的,[匹配 {,並將光標移向它。]將光標移向}。
       關於 ]],][,[[,[]的一個警告:它們只匹配第一列上的符號。如果用戶想讓這些按鍵匹配不管是不是第一列上的符號。VIM的文檔有相關的介紹。用戶可以 自定義按鍵映射來找到那些符號。事實上,你不需要花費太多的時間在映射上。下面推薦的映射能很好的完成那些功能。
:map [[ ?{<CTRL−VCTRL−M>w99[{

 

:map ][ /}<CTRL−VCTRL−M>b99]}

 

:map ]] j0[[%/{<CTRL−VCTRL−M>

 

:map [] k$][%?}<CTRL−VCTRL−M>

 

2.3 按鍵%
        %用來匹配光標之後的下一個項目,可以是一個圓括號,一個大括號或是一個方括號。通過按%鍵,光標自動跳到相應的匹配處。
        此外,%也可以用來匹配#if,#ifdef,#else,#elif和#endif。
        該按鍵在確認寫好的代碼時十分有用。例如:

 

圖5

 

 

        檢查上面的代碼包括檢查圓括號使用的正確與否。%用來從一個圓括號跳到它對應的另一個。因此,用戶可以找到多寫或少寫的圓括號,並修正。
        類似的,%也可以用來在{和它對應的}間跳轉。

 

3.在文件中任意位置跳轉
3.1 ctags
        Tag是有序的位置保持集。Tags對於理解和編輯C十分有用。它們是C文件中的書籤集。當你需要從某個被調用的函數出發跳轉到它的定義並隨時跳回 時,Tags十分有用。

 

        來看看下面的例子:

 

圖6

 

 

       假設你正在編輯函數foo(),而你想看看函數bar()的定義。此時就可以使用Tags。用戶可以跳轉到bar()的定義,然後跳回來。如果需要,甚至 可以跳轉到另一個被bar()調用的函數去,接着再跳轉回來。那麼,要如何使用Tags呢?用戶首先需要對所有源文件使用程序ctags。它將建立一個名 爲tags的文件。該文件包含了VIM編寫的每個函數定義的指針。通過這些指針,很輕鬆的就能找到所有的函數。確切的用於跳轉的按鍵是CTRL-]和 CTRL-T,分別用於向後查找和向前返回。繼續看前面的例子,當在函數foo()中bar()被調用的位置上按下CTRL-],光標自動跳轉至函數 bar()的開始處。然後你可以按CTRL-T從bar()中返回到foo()。

 

        程序ctags按照如下方式調用:$ ctags options file(s)

 

        爲當前目錄下所有c文件生成tags,輸入命令:$ ctags *.c

 

        如果某一文件夾中不同子目錄中包含C文件,用戶可以在主目錄下調用命令:$ ctags −R *.c 來生成各個文件的tags。

 

        關於ctags還有許多的選項,可以查看ctags的手冊來獲得更多信息。

 

3.2 marks
        Marks和Tags很像,但是marks可以被設置在文件中的任意位置,而不僅僅是在函數,枚舉處。此外marks必須用戶手動設置。 設置一個mark沒有顯式的標記。mark只是VIM記着的一個文件位置。例如下面的代碼:

 

圖7

 

 

        假設你正編輯行:x++;你希望在你編輯完其他行後能夠快速的返回到該行。這時你可以通過按鍵m'來爲該行設置一個mark,然後按''回到該行。

 

        VIM允許你設置多個mark,這些mark保存於寄存器a-z,A-Z以及1-0。例如,設置一個mark並保存於寄存器j,可以按mj,返回該 mark可以按'j。
        設置多個mark在前進或後退到某片代碼顯得十分有用。來看這個例子。用戶可以在x++處設置一個mark,在y=x處再設置一個,然後再這兩個 mark中來回跳轉。

 

       Marks甚至可以在文件間跳轉。用戶可以使用寄存器A-Z來實現此功能。寄存器a-z只能在文件裏不同代碼塊間跳轉。也就是說,如果你在文件foo。c 中設置了mark,使用的是寄存器a,那麼到另一個文件中按下'a並不能將光標移到foo。c中的mark位置。如果你需要一個能夠帶你到另一個文件的 mark,就得使用大寫的寄存器A-Z。例如,用mA代替ma。在接下來的章節裏我將討論如何進行多文件編輯。

 

3.3按鍵gd
        先來看看下面的代碼:

 

圖8

 

 

        假設由於某些原因你忘記了y和z是什麼而想快速的找到它們的定義。一種方法是向後查找y和z。VIM提供了另一種更加簡單而快捷的方案:類似於 goto定義的按鍵gd。當光標在y上,你按gd,這時光標將自動跳轉到y
的定義:struct Y y;
        另一個相似的按鍵是gD。它會帶你到變量的全局定義處。所以如果用戶想查看x的定義,按gD便可以了。

 

4.自動補完單詞
        先看看下面的代碼:

 

圖9

 

 

       函數A_Very_Long_Function_Name()可能要一遍又一遍輸入,在插入模式,用戶可以通過前向或後向搜索自動補完單詞。在函數 Another_Function中,用戶可以輸入A_Very...然後按下Ctrl-P,第一個匹配到的單詞將顯示。在例子中,它顯示爲 A_Very_Long_Variable_Name,如果匹配的不符合你的需求,可以再按Ctrl-P,繼續搜索下個匹配的單詞,顯示爲 A_Very_Long_Function_Name。一旦單詞匹配正確,你就可以繼續書寫程序了。在整個過程中VIM保持插入狀態。
        和Ctrl-P類似的按鍵是Ctrl-N,它先向前搜索最匹配的。這兩組按鍵相同的是到達文件頂部或底部後都將自動繼續搜索。
       CTRL-P和CTRL-N都是模式CTRL-X的一部分,而CTRL-X又是insert模式的子模式。所以當你再insert模式下的時候就可以進入 該模式。離開CTRL-X模式可以通過除了CTRL-P,CTRL-N,CTRL-X的按鍵來實現。一旦離開CTRL-X模式,你將回到insert模 式。
        CTRL-X模式下你可以有多種方式來實現自動補完。你甚至可以自動補完文件名。這在你寫include頭文件的時候很有用。例如通過下面的方式, 你可以包含一個foo.h文件。

 

#include "f CTRL−X CTRL−F"
       是的,是CTRL-XCTRL-F,聽起來很象emacs。在CTRL-X模式下,你還可以做很多其他事情。其中之一就是字典補完 (Dictionarycompletion)。字典補完允許用戶指定一個包含了關鍵字的文件,它可以用於自動補全單詞。默認狀態下字典選項是沒有設置 的。該選項可以通過命令:set dictionary=file 來設置。通常用戶可以在字典文件裏輸入C關鍵 字,typedefs,#defines。C++和java程序員可能更喜歡添加類名。
        字典文件的格式十分簡單,僅僅是每行一個單詞就可以了。一個C字典文件看起來就像下面的圖一樣。

 

圖10

 

 

        使用字典補完,用戶需要按CTRL-X CTRL-K。補全單詞的方式很像按鍵CTRL-P和CTRL-N。所以,例如要輸入'typedef',只需要按CTRL-X CTRL-K然後選擇就好了。

 

5.自動格式化
5.1 格式化列寬
        用戶通常希望使用80或75的列寬。這可以通過命令:set textwidth=80 輕 松的實現。

 

        可以將該命令寫進你的.vimrc文件中,它將自動執行。  
        如果你需要在確定的文本寬度下自動換行,命令如下,通常該選項在終端下已經既定了。

 

       :set wrapwidth=60
        上面的命令設置文本寬度爲60列。
5.2自動縮進代碼
        在C編碼時,用戶常常想要indent縮進內嵌代碼塊。若要在編碼時自動完成它,VIM提供了一個叫做cindent的選項。使用下面的命令來完 成:
        :set cindent
        通過設置cindent,代碼變得很漂亮。你可以把上面的命令加進你的.vimrc文件中,讓它自動執行。
5.3註釋
        VIM也可以讓你自動格式化註釋。你可以把註釋分解成3塊:開始部分。中間部分和結束部分。例如,你的編碼格式需求可能需要註釋表示爲如下樣式:

 

/*
* This is the comment
*/

        在這個例子裏,你可以使用下面的命令來格式化它。

 

:set comments=sl:/*,mb:**,elx:*
        我來解釋一下這個命令,命令分成三個部分。第一部分是sl:/*,這告訴VIM註釋包括三塊,以/*開始。下一部分告訴VIM中間的註釋是*,最後 一部分告訴VIM幾件事。一是註釋要以*/結尾,另一是當你按下/時它會自動補完註釋。
        我們再來看一個例子。假設你的註釋樣式如下:

 

/*
** This is the comment
*/

        你可以輸入這條命令:

 

:set comments=sl:/*,mb:**,elx:*
        插入一條註釋時,輸入/*並按回車。下一行會自動填上**,當你寫完一行註釋後按回車,下一行又會自動補上**,如果你想要結束註釋,不需要刪除一 個*再補上一個/,只要按/,VIM會自動結束註釋。怎麼樣,VIM聰明吧。

 

快速多行註釋
        正常模式下按Ctrl+v進入塊選擇模式,先選定你要註釋的行,按I輸入//,再按下Esc
        這個對於其它風格的註釋也適用,比如shell腳本文件下,操作時用#代替//輸入,反之你也可以在塊選擇模式下,選定塊,然後按x,快速移除註釋

 

6.多文件編輯
        用戶可以一次編輯多個文件。例如,你可以同時編輯一個頭文件和源代碼文件。若想一次編輯更多文件,按下面的命令調用VIM。

 

$ vim file1 file2 ...

 

       現在,你就可以先編輯第一個文件,同時可以使用命令:n移至下一個文件。 你也可以使用命令:e#返回上一個文件。當你編碼時,同時可以看到兩個文件而且能在它們之間切換應該很有用。換句話說,如果屏幕被分成兩部分,上面顯示頭 文件,下面顯示代碼文件,對你的編程應該很有用。Vim有這樣一個命令可以實現該功能。輸入命令:split即可。

 

        在兩個窗口中顯示相同的文件,無論調用了什麼命令,都只將影響處於焦點的窗口。於是用戶可以使用命令:e file2來在另一個窗口中編輯另一個文件。

 

        執行完那個命令後,你將發現有兩個文件處於可視狀態。一個窗口顯示第一個文件,而另一個窗口顯示了第二個文件。在這兩個文件間切換可以使用命令 CTRL-W。

 

        使用幫助來獲取更多關於窗口分割方面的知識。

 

7.快速查錯
        當你編寫C程序時常常會陷入編輯-編譯-編輯的循環中。典型的例子就是你在使用其他軟件編輯C文件時,保存文件,編譯代碼,然後找到錯誤再重新編 輯。VIM使用了一種叫做快速查錯的模式來加快這一循環過程。基
本上用戶需要把編譯器錯誤保存到一個文件。然後用下面的命令打開這個文件。

 

        $ vim −q compiler_error_file
        VIM將會自動打開包含錯誤的文件並定位到第一個錯誤。
        使用命令"make",用戶可以自動編譯代碼並跳轉到第一個出錯的位置。按下面的方式調用make命令。

 

        :make
        基本上,該命令調用了shell下的make,並轉到第一個錯誤上。然而,如果你不是用make來編譯而用例如cc之類的命令編譯,那麼你得爲 make命令設置一個稱作makeprg的變量。例如:set makeprg=cc/ foo.c
        設置完makeprg之後,你就可以使用make並快速查錯了。
        在你改完第一個錯誤後,若要修改第二個錯誤,可以使用命令:cn
        返回第一個錯誤用命令:cN
        我將給出幾個例子做示範。看看下面的代碼:

 

圖11

 

 

        你可以看到第5行有個錯誤。文件保存爲test。c,makeprg也用命令::set makeprg=gcc/ test.c設置了。
        接下來使用命令make,gcc給出瞭如下的錯誤提示

 

圖12

 

 

        按下回車,光標自動移至第gi6行。
        現在命令:cn將把光標移至第4行
        用命令:cN返回上一個錯誤,光標會移到第6行。
        改完錯誤後,用戶再執行:make,成功了。

 

圖13

 

 

        這只是一個很小的例子,你可以使用快速查錯功能來解決編譯時的問題。而且儘可能的減少編輯-編譯-編輯的循環時間。

 

8.版權
        Copyright(c)2000,2001 Siddharth Heroor 在GNU FDL協議許可的範圍內,本文可以拷貝,發佈或是修改。v1。1及其後版本通過FSS出版。可以在http://www.gnu.org/copyleft/fdl.html 找 到一份license的拷貝。

 

9.參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章