2009/02/11

打造自己的VIM: QuickFix 編譯視窗

QuickFix視窗(之後簡稱QF)在VIM裡是一個很方便的功能,它最常見的功能是將編譯時的輸出訊息導入到QF中,在QF中,我們可以快速切換至編譯錯誤的檔案及錯誤行上。除了這個功能外,我們亦可用一些plugin將搜尋字串或檔案的結果輸出到QF內,以方便我們快速瀏覽。

本篇文章,將簡介如何將QF用在編譯除錯及常見指令彙整,最後我將為QF做一些更方便快速鍵。本篇文章參考自VIM document [quickfix]


QF簡介

在編譯程式時,不管在Linux平台或Windows平台,make是最常使用到的專案管理工具之一。VIM則提供了一個:make的指令去呼叫外部make,可能是gmake或nmake來協助編譯程式並輸出到QF視窗中。與:make有關的選項,各位可以參考:options中第23大項的內容,如下圖或VIM document [quickfix]。



接著,我將由一個C的hello world帶領各位使用QF。因為編譯時會呼叫到外部指令,gcc或make,所以請各位在開始前先確定自己的shell(cmd.exe or bash)可以正確執行gcc及make。我的環境是Windows XP及Cygwin(包含make及gcc),並且在環境變數PATH加入了cygwin bin的路徑。

首先,我們先寫一個有問題的hello world,如下圖,在第6行處有一個變數未宣告。接著我們輸入

:make a

其中:make為VIM指令,a為檔名不包含副檔名。在這裡make與nmake會有差別,nmake必需輸入a.exe,這是由於兩種make程式的predefined rule不同的關係。按下enter後,a.c的視窗下方就會自動彈出QF視窗(若是沒彈出來,自己輸入:copen指令),且包含了錯誤訊息,接著各位可以再試:cnext或:cprev的指令來切換下一個或前一個錯誤訊息,在切換的過程,若檔案或行號不同,它會自動幫我們跳到該處。


對於一般的小程式(只有一份source code,不用複雜的compile和link),這樣的功能應該就夠了,對於稍有規模的專案則寫一個makefile就是必需的了,至於makefile要怎麼寫,各位就自己去查一下了,網上資源一堆。


指令彙整

我只列出我常用的。

:make " 編譯程式

:copen " 打開QF視窗
:cclose " 關閉QF視窗

:cnext " 移到下一個錯誤
:cprev " 移到前一個錯誤

:cnewer " 若有多個QF buffer,移到下一個錯誤訊息列表
:colde " 若有多個QF buffer,移到前一個錯誤訊息列表



快速鍵

跟QF有關的指令真是又多又長,若是用了前幾篇的[自訂目錄]的話,應該可以發現我加了幾個快速鍵,如下圖,我將依此目錄我有修改的部份一個個講解。這些分別為:
  • QuickFix switch
  • Newer List
  • Older List
  • Next Error
  • Previous Error
這些東西可以視自己的需要加到vimrc裡。


QuickFix Switch

切換QF視窗不只指令長,打開關閉也要用不同指令,實在是非常麻煩,所以小弟寫了一個小function及一個map便可用F8鍵來做切換QF的功能。

map <F8> <ESC>:call QFSwitch()<CR>
function! QFSwitch()
redir => ls_output
execute ':silent! ls'
redir END

let exists = match(ls_output, "[Quickfix List")
if exists == -1
execute ':copen'
else
execute ':cclose'
endif
endfunction

其它指令

因為其他都只是alias而已,我直接列出來我的設定。

map <F8> <ESC>:QFSwitch<CR>
map <S-F8> <ESC>:colder<CR>
map <C-F8> <ESC>:cnewer<CR>
map <C-n> <ESC>:cnext<CR>
map <C-p> <ESC>:cprev<CR>




No comments: