通常,我們在開發過程中,經常要寫代碼,編譯,修改編譯錯誤,這個過程會數十遍上百遍的重複。如果你是根據編譯器輸出的錯誤資訊,開啟出錯的檔案,找到出錯的行,然後再開始修改,那效率未免太低下了。
利用vim的quickfix模式,可以大大加快這一過程,你可以在vim啟動編譯,然後vim會根據編譯器輸出的錯誤資訊,自動跳到第一個出錯的地方,讓你進行修改;修改完後,使用一個快速鍵,跳到下一個錯誤處,再進行修改,方便的很。
為了做到這一點,你首先要定義編譯時間所使用的程式,對大多數使用Makefile的項目來說,vim的預設設定”make“已經可以滿足要求了。如果你的項目需要用一個特殊的程式進行編譯,就需要修改’makeprg‘選項的值。
大家在學編程時大概都讀過”hello world”程式,我們就以這個簡單的例子為例,講一下quickfix模式的用法。
該程式的內容如下,裡麵包含了三個小小的錯誤:
<pre>/* hello world demo */#include <stdio.h"int main(int argc, char **argv){ int i; print("hello world\n"); return 0;} <\pre>
我們可以為這個程式寫個小小的Makefile檔案,不過為了示範makeprg的設定方法,我們並不用Makefile,而直接設定makeprg選項,如下:
<pre>:set makeprg=gcc\ -Wall\ -o\ hello\ hello.c </pre>
上面的命令會把hello.c編譯為名hello的可執行檔,並開啟了所有的Warnning。如果編譯命令中有空格,需要使用’\‘對空格進行轉義,上面的例子就使用了’\‘轉義空格。
我們設定好makeprg選項後,輸入下面的命令就可以編譯了:
我們修改一下main.c, 人為地造成幾處錯誤, 在第1019行增加了一個baobao_wu的沒有任何定義的字串, 刪除了第1020行最後的一個括弧")", 然後用下面的命令進行編譯:
顯然編譯會報很多錯誤, 當編譯結束並退出到源碼介面時, 剛才編譯器報的錯誤都已經看不到了, 但是我們可以用QuickFix視窗再將錯誤資訊找出來, 用下面的命令調出QuickFix視窗:
此時你就可以看如下圖所示的QuickFix視窗了:
在使用:make時,vim會自動調用makeprg選項定義的命令進行編譯,並把編譯輸出重新導向到一個臨時檔案中,當編譯出現錯誤時,vim會從上述臨時檔案中讀出錯誤資訊,根據這些資訊形成quickfix列表,並跳轉到第一個錯誤出現的地方。
對於我們上面的程式來說,游標會停在第三行,也就是第一個出錯的位置,vim同時會提示出錯資訊。如果你沒看清出錯資訊,可以輸入”:cc“命令,vim會更次顯示此資訊,或者乾脆使用”:cw“命令,開啟一個quickfix視窗,把所有的出錯資訊顯示出來。
現在我們知道錯在哪兒了,修正一下,然後使用”:cn“命令(或者在Quickfix List對應行上輸入斷行符號)跳到下一個出錯的地方,以此類推,直到修正全部錯誤。
好了,千辛萬苦,我們的hello world終於工作了。乍一看這個例子,似乎Quickfix並沒有提高什麼效率,但如果你的錯誤出現在多個不同目錄的不同檔案裡,它可以幫你省很多時間,使你可以集中精力在修正bug上。
vim可以同時記住最新的10個錯誤清單,也就是說你最近10次使用:make命令編譯所遇到的錯誤都儲存著,可以使用:colder和:cnewer命令,回到舊的錯誤清單,或者到更新的錯誤清單。
在quickfix模式裡經常用到的命令有: :cc 顯示詳細錯誤資訊 ( :help :cc ) :cp 跳到上一個錯誤 ( :help :cp ) :cn 跳到下一個錯誤 ( :help :cn ) :cl 列出所有錯誤 ( :help :cl ) :cw 如果有錯誤清單,則開啟quickfix視窗 ( :help :cw ) :col 到前一箇舊的錯誤清單 ( :help :col ) :cnew 到後一個較新的錯誤清單 ( :help :cnew )
更多的命令,以及這些命令更詳細的解釋,請參見手冊。
對於經常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定義:
在vim7中,每個視窗都可以擁有自己的位置列表,這樣,你就能夠同時開啟多個位置列表了,而quickfix列表在整個vim中只有一個。你可以使用位置列表來顯示編譯錯誤資訊,具體命令參閱手冊::help location-list以及:help :lmake。