QuickFix
本節(jié)所用命令的幫助入口:
:help quickfix
:help :make
:help 'makeprg'
:help 'errorformat'
:help 'switchbuf'
:help location-list
:help grep
:help :vimgrep
:help :grep
:help starstar-wildcard
以前讀武俠小說(shuō),看到武林高手們都是從來(lái)劍不離手的。使用VIM開(kāi)發(fā)軟件項(xiàng)目,你也可以做到這一點(diǎn),:-)
VIM由一個(gè)程序員開(kāi)發(fā),而且為更多的程序所使用,所以在VIM中加強(qiáng)了對(duì)軟件開(kāi)發(fā)的支持,quickfix模式的引入就是一個(gè)例子。所謂quickfix模式,它和Normal模式、Insert模式?jīng)]什么關(guān)系,它只是一種加速你開(kāi)發(fā)的工作方式。
Quickfix模式的主要思想是保存一個(gè)位置列表,然后提供一系列命令,實(shí)現(xiàn)在這個(gè)位置列表中跳轉(zhuǎn)。
位置列表的產(chǎn)生可以從編譯器的編譯輸出信息中獲得,也可以由grep命令的輸出信息中獲得,我們上篇文章所介紹的cscope命令,也可以產(chǎn)生位置列表信息(:help 'cscopequickfix')。
[編譯]
通常,我們?cè)陂_(kāi)發(fā)過(guò)程中,經(jīng)常要寫代碼,編譯,修改編譯錯(cuò)誤,這個(gè)過(guò)程會(huì)數(shù)十遍上百遍的重復(fù)。如果你是根據(jù)編譯器輸出的錯(cuò)誤信息,打開(kāi)出錯(cuò)的文件,找到出錯(cuò)的行,然后再開(kāi)始修改,那效率未免太低下了。
利用VIM的quickfix模式,可以大大加快這一過(guò)程,你可以在VIM啟動(dòng)編譯,然后VIM會(huì)根據(jù)編譯器輸出的錯(cuò)誤信息,自動(dòng)跳到第一個(gè)出錯(cuò)的地方,讓你進(jìn)行修改;修改完后,使用一個(gè)快捷鍵,跳到下一個(gè)錯(cuò)誤處,再進(jìn)行修改,方便的很。
為了做到這一點(diǎn),你首先要定義編譯時(shí)所使用的程序,對(duì)大多數(shù)使用Makefile的項(xiàng)目來(lái)說(shuō),VIM的缺省設(shè)置“make”已經(jīng)可以滿足要求了。如果你的項(xiàng)目需要用一個(gè)特殊的程序進(jìn)行編譯,就需要修改'makeprg'選項(xiàng)的值。
大家在學(xué)編程時(shí)大概都見(jiàn)到過(guò)"hello world"程序,我們就以這個(gè)簡(jiǎn)單的例子為例,講一下quickfix模式的用法。
該程序的內(nèi)容如下,里面包含了三個(gè)小小的錯(cuò)誤:
/* hello world demo */
#include?
我們可以為這個(gè)程序?qū)憘€(gè)小小的Makefile文件,不過(guò)為了演示'makeprg'的設(shè)置方法,我們并不用Makefile,而直接設(shè)置'makeprg'選項(xiàng),如下:
:set makeprg=gcc\ -Wall\ -ohello\ hello.c
上面的命令會(huì)把hello.c編譯為名hello的可執(zhí)行文件,并打開(kāi)了所有的Warnning。如果編譯命令中有空格,需要使用'\'對(duì)其進(jìn)行轉(zhuǎn)義,上面的例子就是這種情況。
我們?cè)O(shè)置好'makeprg'選項(xiàng)后,輸入下面的命令就可以編譯了:
:make
在使用“:make”時(shí),VIM會(huì)自動(dòng)調(diào)用'makeprg'選項(xiàng)定義的命令進(jìn)行編譯,并把編譯輸出重定向到一個(gè)臨時(shí)文件中,當(dāng)編譯出現(xiàn)錯(cuò)誤時(shí),VIM會(huì)從上述臨時(shí)文件中讀出錯(cuò)誤信息,根據(jù)這些信息形成quickfix列表,并跳轉(zhuǎn)到第一個(gè)錯(cuò)誤出現(xiàn)的地方。
對(duì)于我們上面的程序來(lái)說(shuō),光標(biāo)會(huì)停在第三行,也就是第一個(gè)出錯(cuò)的位置,VIM同時(shí)會(huì)提示出錯(cuò)信息。如果你沒(méi)看清出錯(cuò)信息,可以輸入“:cc”命令,VIM會(huì)更次顯示此信息,或者干脆使用“:cw”命令,打開(kāi)一個(gè)quickfix窗口,把所有的出錯(cuò)信息顯示出來(lái),見(jiàn)下圖:
現(xiàn)在我們知道錯(cuò)在哪兒了,修正一下,然后使用“:cn”命令(或者在Quickfix List對(duì)應(yīng)行上輸入回車)跳到下一個(gè)出錯(cuò)的地方,以此類推,直到修正全部錯(cuò)誤。
好了,千辛萬(wàn)苦,我們的hello world終于工作了。乍一看這個(gè)例子,似乎Quickfix并沒(méi)有提高什么效率,但如果你的錯(cuò)誤出現(xiàn)在多個(gè)不同目錄的文件里,它可以幫你省很多時(shí)間,使你可以集中精力在修正bug上。
VIM可以同時(shí)記住最新的10個(gè)錯(cuò)誤列表,也就是說(shuō)你最近10次使用“:make”命令編譯所遇到的錯(cuò)誤都保存著,可以使用“:colder”和“:cnewer”命令,回到舊的錯(cuò)誤列表,或者到更新的錯(cuò)誤列表。
在quickfix模式里經(jīng)常用到的命令有:
:cc? ?? ?? ?? ?? ? 顯示詳細(xì)錯(cuò)誤信息 ( :help :cc )
:cp? ?? ?? ?? ?? ? 跳到上一個(gè)錯(cuò)誤 ( :help :cp )
:cn? ?? ?? ?? ?? ? 跳到下一個(gè)錯(cuò)誤 ( :help :cn )
:cl? ?? ?? ?? ?? ? 列出所有錯(cuò)誤 ( :help :cl )
:cw? ?? ?? ?? ?? ? 如果有錯(cuò)誤列表,則打開(kāi)quickfix窗口 ( :help :cw )
:col? ?? ?? ?? ?? ?到前一個(gè)舊的錯(cuò)誤列表 ( :help :col )
:cnew? ?? ?? ?? ???到后一個(gè)較新的錯(cuò)誤列表 ( :help :cnew )
更多的命令,以及這些命令更詳細(xì)的解釋,請(qǐng)參見(jiàn)手冊(cè)。
對(duì)于經(jīng)常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定義:
autocmd FileType c,cpp??map? ?:w:make
nmap cn :cn
nmap cp :cp
nmap cw :cw 10
現(xiàn)在使用“,”就可以編譯,使用“,cp”和“,cn”跳到上一個(gè)和下一個(gè)錯(cuò)誤,使用“,cw”來(lái)打開(kāi)一個(gè)quickfix窗口。這下順手多了!
如果你希望跳轉(zhuǎn)到出錯(cuò)的文件時(shí),使用一個(gè)分隔的窗口打開(kāi),請(qǐng)參閱'switchbuf'選項(xiàng)的值。
在VIM7中,每個(gè)窗口都可以擁有自己的位置列表,這樣,你就能夠同時(shí)打開(kāi)多個(gè)位置列表了,而quickfix列表在整個(gè)VIM中只有一個(gè)。你可以使用位置列表來(lái)顯示編譯錯(cuò)誤信息,具體命令參閱手冊(cè):“:help location-list”以及“:help :lmake”
[GREP]
我們?cè)谏弦黄恼轮兄v過(guò),cscope可以做為一個(gè)快速的grep程序使用,對(duì)于我們的軟件項(xiàng)目,用cscope生成一個(gè)數(shù)據(jù)庫(kù),可以大大加快查找字符串的速度。但cscope需要事先生成一個(gè)數(shù)據(jù)庫(kù),對(duì)一些簡(jiǎn)單的查找,不需要專門為之生成數(shù)據(jù)庫(kù),這時(shí)候可以使用grep。
Grep的名字來(lái)源于“g/re/p”,“re”是正則表達(dá)式的意義,“p”是打印,也就是把匹配正則表達(dá)式的行打印出來(lái)。
VIM既可以使用外部的grep程序,也可以使用內(nèi)部集中的grep功能。
使用集成的grep命令非常簡(jiǎn)單,通常使用格式為:
:vimgrep /main/gj **/*.c
在上面的例子里,我們使用VIM內(nèi)部集成的grep功能,在當(dāng)前目錄及其子目錄樹(shù)的所有c文件中查找main字符串,如果一行中main出現(xiàn)了多次,每個(gè)匹配都計(jì)入;在查找到后,不立即跳轉(zhuǎn)到第一個(gè)匹配的地方。
使用內(nèi)部集成的grep功能速度要比外部grep慢一些,因?yàn)樗鼤?huì)打開(kāi)每個(gè)文件,對(duì)其進(jìn)行檢查,然后關(guān)閉;但集成的grep支持VIM增強(qiáng)的正則表達(dá)式,可以利用它進(jìn)行更為復(fù)雜的查找。它也支持VIM擴(kuò)展的文件通配符表示方式,見(jiàn)“:help starstar-wildcard”。
vimgrep查找到的結(jié)果,也會(huì)放在quickfix列表中。下圖是在VIM 7.0的源代碼目錄中執(zhí)行上面的命令生成的quickfix列表:
我們可以使用上面介紹的quickfix模式的命令,來(lái)查看這些匹配。
你也可以用外部的grep程序來(lái)查找,如果你的系統(tǒng)中所用的不是標(biāo)準(zhǔn)的grep程序,那么就需要修改'grepprg'選項(xiàng),詳情請(qǐng)參閱手冊(cè)。
使用外部grep的語(yǔ)法與grep程序相同,請(qǐng)參閱grep的手冊(cè)。
無(wú)論使用內(nèi)部的vimgrep,還是使用外部的grep,VIM都允許你將查找到的結(jié)果放在與窗口相關(guān)聯(lián)的位置列表,要了解詳細(xì)信息,“:help :lvimgrep”及“:help :lgrep”。
在我的vimrc中,定義下面的鍵映射,利用它可以在當(dāng)前文件中快速查找光標(biāo)下的單詞,并打開(kāi)窗口位置列表顯示出來(lái):
nmap lv :lv /=expand("")/ %:lw
[參考文檔]
1. VIM幫助文件
2.?
http://vimcdoc.sourceforge.net/
:help quickfix
:help :make
:help 'makeprg'
:help 'errorformat'
:help 'switchbuf'
:help location-list
:help grep
:help :vimgrep
:help :grep
:help starstar-wildcard
以前讀武俠小說(shuō),看到武林高手們都是從來(lái)劍不離手的。使用VIM開(kāi)發(fā)軟件項(xiàng)目,你也可以做到這一點(diǎn),:-)
VIM由一個(gè)程序員開(kāi)發(fā),而且為更多的程序所使用,所以在VIM中加強(qiáng)了對(duì)軟件開(kāi)發(fā)的支持,quickfix模式的引入就是一個(gè)例子。所謂quickfix模式,它和Normal模式、Insert模式?jīng)]什么關(guān)系,它只是一種加速你開(kāi)發(fā)的工作方式。
Quickfix模式的主要思想是保存一個(gè)位置列表,然后提供一系列命令,實(shí)現(xiàn)在這個(gè)位置列表中跳轉(zhuǎn)。
位置列表的產(chǎn)生可以從編譯器的編譯輸出信息中獲得,也可以由grep命令的輸出信息中獲得,我們上篇文章所介紹的cscope命令,也可以產(chǎn)生位置列表信息(:help 'cscopequickfix')。
[編譯]
通常,我們?cè)陂_(kāi)發(fā)過(guò)程中,經(jīng)常要寫代碼,編譯,修改編譯錯(cuò)誤,這個(gè)過(guò)程會(huì)數(shù)十遍上百遍的重復(fù)。如果你是根據(jù)編譯器輸出的錯(cuò)誤信息,打開(kāi)出錯(cuò)的文件,找到出錯(cuò)的行,然后再開(kāi)始修改,那效率未免太低下了。
利用VIM的quickfix模式,可以大大加快這一過(guò)程,你可以在VIM啟動(dòng)編譯,然后VIM會(huì)根據(jù)編譯器輸出的錯(cuò)誤信息,自動(dòng)跳到第一個(gè)出錯(cuò)的地方,讓你進(jìn)行修改;修改完后,使用一個(gè)快捷鍵,跳到下一個(gè)錯(cuò)誤處,再進(jìn)行修改,方便的很。
為了做到這一點(diǎn),你首先要定義編譯時(shí)所使用的程序,對(duì)大多數(shù)使用Makefile的項(xiàng)目來(lái)說(shuō),VIM的缺省設(shè)置“make”已經(jīng)可以滿足要求了。如果你的項(xiàng)目需要用一個(gè)特殊的程序進(jìn)行編譯,就需要修改'makeprg'選項(xiàng)的值。
大家在學(xué)編程時(shí)大概都見(jiàn)到過(guò)"hello world"程序,我們就以這個(gè)簡(jiǎn)單的例子為例,講一下quickfix模式的用法。
該程序的內(nèi)容如下,里面包含了三個(gè)小小的錯(cuò)誤:
/* hello world demo */
#include?
我們可以為這個(gè)程序?qū)憘€(gè)小小的Makefile文件,不過(guò)為了演示'makeprg'的設(shè)置方法,我們并不用Makefile,而直接設(shè)置'makeprg'選項(xiàng),如下:
:set makeprg=gcc\ -Wall\ -ohello\ hello.c
上面的命令會(huì)把hello.c編譯為名hello的可執(zhí)行文件,并打開(kāi)了所有的Warnning。如果編譯命令中有空格,需要使用'\'對(duì)其進(jìn)行轉(zhuǎn)義,上面的例子就是這種情況。
我們?cè)O(shè)置好'makeprg'選項(xiàng)后,輸入下面的命令就可以編譯了:
:make
在使用“:make”時(shí),VIM會(huì)自動(dòng)調(diào)用'makeprg'選項(xiàng)定義的命令進(jìn)行編譯,并把編譯輸出重定向到一個(gè)臨時(shí)文件中,當(dāng)編譯出現(xiàn)錯(cuò)誤時(shí),VIM會(huì)從上述臨時(shí)文件中讀出錯(cuò)誤信息,根據(jù)這些信息形成quickfix列表,并跳轉(zhuǎn)到第一個(gè)錯(cuò)誤出現(xiàn)的地方。
對(duì)于我們上面的程序來(lái)說(shuō),光標(biāo)會(huì)停在第三行,也就是第一個(gè)出錯(cuò)的位置,VIM同時(shí)會(huì)提示出錯(cuò)信息。如果你沒(méi)看清出錯(cuò)信息,可以輸入“:cc”命令,VIM會(huì)更次顯示此信息,或者干脆使用“:cw”命令,打開(kāi)一個(gè)quickfix窗口,把所有的出錯(cuò)信息顯示出來(lái),見(jiàn)下圖:
現(xiàn)在我們知道錯(cuò)在哪兒了,修正一下,然后使用“:cn”命令(或者在Quickfix List對(duì)應(yīng)行上輸入回車)跳到下一個(gè)出錯(cuò)的地方,以此類推,直到修正全部錯(cuò)誤。
好了,千辛萬(wàn)苦,我們的hello world終于工作了。乍一看這個(gè)例子,似乎Quickfix并沒(méi)有提高什么效率,但如果你的錯(cuò)誤出現(xiàn)在多個(gè)不同目錄的文件里,它可以幫你省很多時(shí)間,使你可以集中精力在修正bug上。
VIM可以同時(shí)記住最新的10個(gè)錯(cuò)誤列表,也就是說(shuō)你最近10次使用“:make”命令編譯所遇到的錯(cuò)誤都保存著,可以使用“:colder”和“:cnewer”命令,回到舊的錯(cuò)誤列表,或者到更新的錯(cuò)誤列表。
在quickfix模式里經(jīng)常用到的命令有:
:cc? ?? ?? ?? ?? ? 顯示詳細(xì)錯(cuò)誤信息 ( :help :cc )
:cp? ?? ?? ?? ?? ? 跳到上一個(gè)錯(cuò)誤 ( :help :cp )
:cn? ?? ?? ?? ?? ? 跳到下一個(gè)錯(cuò)誤 ( :help :cn )
:cl? ?? ?? ?? ?? ? 列出所有錯(cuò)誤 ( :help :cl )
:cw? ?? ?? ?? ?? ? 如果有錯(cuò)誤列表,則打開(kāi)quickfix窗口 ( :help :cw )
:col? ?? ?? ?? ?? ?到前一個(gè)舊的錯(cuò)誤列表 ( :help :col )
:cnew? ?? ?? ?? ???到后一個(gè)較新的錯(cuò)誤列表 ( :help :cnew )
更多的命令,以及這些命令更詳細(xì)的解釋,請(qǐng)參見(jiàn)手冊(cè)。
對(duì)于經(jīng)常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定義:
autocmd FileType c,cpp??map? ?:w:make
nmap cn :cn
nmap cp :cp
nmap cw :cw 10
現(xiàn)在使用“,”就可以編譯,使用“,cp”和“,cn”跳到上一個(gè)和下一個(gè)錯(cuò)誤,使用“,cw”來(lái)打開(kāi)一個(gè)quickfix窗口。這下順手多了!
如果你希望跳轉(zhuǎn)到出錯(cuò)的文件時(shí),使用一個(gè)分隔的窗口打開(kāi),請(qǐng)參閱'switchbuf'選項(xiàng)的值。
在VIM7中,每個(gè)窗口都可以擁有自己的位置列表,這樣,你就能夠同時(shí)打開(kāi)多個(gè)位置列表了,而quickfix列表在整個(gè)VIM中只有一個(gè)。你可以使用位置列表來(lái)顯示編譯錯(cuò)誤信息,具體命令參閱手冊(cè):“:help location-list”以及“:help :lmake”
[GREP]
我們?cè)谏弦黄恼轮兄v過(guò),cscope可以做為一個(gè)快速的grep程序使用,對(duì)于我們的軟件項(xiàng)目,用cscope生成一個(gè)數(shù)據(jù)庫(kù),可以大大加快查找字符串的速度。但cscope需要事先生成一個(gè)數(shù)據(jù)庫(kù),對(duì)一些簡(jiǎn)單的查找,不需要專門為之生成數(shù)據(jù)庫(kù),這時(shí)候可以使用grep。
Grep的名字來(lái)源于“g/re/p”,“re”是正則表達(dá)式的意義,“p”是打印,也就是把匹配正則表達(dá)式的行打印出來(lái)。
VIM既可以使用外部的grep程序,也可以使用內(nèi)部集中的grep功能。
使用集成的grep命令非常簡(jiǎn)單,通常使用格式為:
:vimgrep /main/gj **/*.c
在上面的例子里,我們使用VIM內(nèi)部集成的grep功能,在當(dāng)前目錄及其子目錄樹(shù)的所有c文件中查找main字符串,如果一行中main出現(xiàn)了多次,每個(gè)匹配都計(jì)入;在查找到后,不立即跳轉(zhuǎn)到第一個(gè)匹配的地方。
使用內(nèi)部集成的grep功能速度要比外部grep慢一些,因?yàn)樗鼤?huì)打開(kāi)每個(gè)文件,對(duì)其進(jìn)行檢查,然后關(guān)閉;但集成的grep支持VIM增強(qiáng)的正則表達(dá)式,可以利用它進(jìn)行更為復(fù)雜的查找。它也支持VIM擴(kuò)展的文件通配符表示方式,見(jiàn)“:help starstar-wildcard”。
vimgrep查找到的結(jié)果,也會(huì)放在quickfix列表中。下圖是在VIM 7.0的源代碼目錄中執(zhí)行上面的命令生成的quickfix列表:
我們可以使用上面介紹的quickfix模式的命令,來(lái)查看這些匹配。
你也可以用外部的grep程序來(lái)查找,如果你的系統(tǒng)中所用的不是標(biāo)準(zhǔn)的grep程序,那么就需要修改'grepprg'選項(xiàng),詳情請(qǐng)參閱手冊(cè)。
使用外部grep的語(yǔ)法與grep程序相同,請(qǐng)參閱grep的手冊(cè)。
無(wú)論使用內(nèi)部的vimgrep,還是使用外部的grep,VIM都允許你將查找到的結(jié)果放在與窗口相關(guān)聯(lián)的位置列表,要了解詳細(xì)信息,“:help :lvimgrep”及“:help :lgrep”。
在我的vimrc中,定義下面的鍵映射,利用它可以在當(dāng)前文件中快速查找光標(biāo)下的單詞,并打開(kāi)窗口位置列表顯示出來(lái):
nmap lv :lv /=expand("")/ %:lw
[參考文檔]
1. VIM幫助文件
2.?
http://vimcdoc.sourceforge.net/
總結(jié)
- 上一篇: C++ Map Source
- 下一篇: 文本分类 特征选取之CHI开方检验