vim + ctags + taglist + cscope + cppcomplete + global 使用初探
由于本人比較喜歡在終端狀態(tài)下的vim,所以gvim下的擴(kuò)展使用的不多。這里介紹的也是我簡(jiǎn)單的使用以上擴(kuò)展的一點(diǎn)點(diǎn)體會(huì)。請(qǐng)大家指正。 emacs 不會(huì)用,也沒(méi)有比較過(guò)拉。
1、大體感覺(jué),(因?yàn)槭褂脮r(shí)間不長(zhǎng),不全面)
總體使用的感覺(jué)定位查找類型定義基本可以用,但自動(dòng)補(bǔ)全類型方面由于ctags的功能有限,感覺(jué)在大工程時(shí),不一定很好用。
大型程序一定要global的參與,它的分析比較全面,但在vim中的提示信息有限。
taglist 精干,需要ctags的支撐,直接可以在左邊列出函數(shù)列表,全局參數(shù)列表。(可以排序)
cscope 比較強(qiáng)大,可以對(duì)函數(shù)以及部分類型定義進(jìn)行跳轉(zhuǎn),但有些BUG,好像在某些條件下無(wú)法正確找到分析枚舉的定義。
cppcomplete 需要ctags的支撐,可以補(bǔ)全類型或者函數(shù)名(可不是普通Ctrl+P/N的那種)
global 新版本可以嵌入vim使用,提供比較完整解析和類型索引,和cscope比,稍微差些的就是對(duì)類型引用的打印列表中沒(méi)有標(biāo)識(shí)這個(gè)引用在什么函數(shù)中進(jìn)行的。其實(shí)我的感覺(jué)global可能不是為vim所生,它的主要目的是用html的方式進(jìn)行表達(dá)相關(guān)的關(guān)聯(lián)關(guān)系和索引,使用起來(lái)感覺(jué)沒(méi)有cscope的那么貼切。
2、相關(guān)的擴(kuò)展的安裝
代碼:
apt-get install exuberant-ctags cscope global
cppcomplete 和 taglist 要到www.vim.org的擴(kuò)展列表中下載。
taglist 的下載地址:
http://www.vim.org/scripts/script.php?script_id=273
cppcomplete 的下載地址:
http://www.vim.org/scripts/script.php?script_id=527
然后在 建立目錄
代碼:
$HOME/.vim/plugin
將下載的cppcomplete.vim 和 taglist.vim拷貝到$HOME/.vim/plugin中。
安裝了global后,最新4.8.6 以上版本有帶vim的擴(kuò)展,將它也拷貝到 $HOME/.vim/plugin
debian sid 版本global安裝后擴(kuò)展文件在
代碼:
/usr/share/doc/global/examples/gtags.vim.gz
需要拷貝到$HOME/.vim/plugin后解壓,解壓方法:
代碼:
gzip -d gtags.vim.gz
3、使用這些工具
1)準(zhǔn)備工作,先修改一下$HOME/.vimrc文件
為了更好的使用cscope請(qǐng)?zhí)砑尤缦聝?nèi)容,這樣Ctrl-]的跳轉(zhuǎn)將由cscope的tags進(jìn)行分析。
代碼:
if has("cscope") set csprg=/usr/bin/cscope set csto=0 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out " else add database pointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverb set cscopetag set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i- endif
2)使用cscope
cscope的tag生成最簡(jiǎn)單的方法是:
在你的開(kāi)發(fā)工程的最上層目錄執(zhí)行cscope-indexer,它會(huì)遍歷下面的所有目錄,生成兩個(gè)文件,一個(gè)是cscope.files,這個(gè)文件記錄需要生成tags的文件名,可以手工修改,另一個(gè)是cscope格式的tags文件cscope.out。
完成后,你在生成了cscope.out的目錄打開(kāi)工程的任意文件,就可以使用Ctrl-]跳轉(zhuǎn)查找類型定義了。
代碼:
cs f s xxxx 查找xxxx出現(xiàn)的地方,它能詳細(xì)列出哪些文件的哪行的哪個(gè)函數(shù)引用,以及該行的內(nèi)容,比較不錯(cuò)。 :)
它的所有命令的使用請(qǐng)參考:
代碼:
help cscope
3)使用taglist
taglist的功能是即時(shí)生成當(dāng)前文件的函數(shù)列表和全局變量列表,便于索引。
在vim中命令模式下使用
Tlist 打開(kāi)或者關(guān)閉當(dāng)前文件的索引;
TlistSync 立即在打開(kāi)的索引窗口中定位當(dāng)前的光標(biāo)所在位置屬于哪個(gè)函數(shù)或者結(jié)構(gòu)定義中。
還有其他命令,請(qǐng)參考它的幫助文件。
4)ctags的使用
其實(shí)cscope是用來(lái)替代ctags功能的,ctags的應(yīng)用廣泛,還有其他很多的軟件依賴它。
例如要生成cppcomplete需要的tags文件的話,需要運(yùn)行下面的命令:
代碼:
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files
注意,我在最后使用了參數(shù)"-L cscope.files" 這僅僅是借用拉cscope生成的文件索引來(lái)幫助ctags去查詢相關(guān)工程文件生成tags。
5)使用cppcomplete
cppcomplete的使用我只是簡(jiǎn)單的發(fā)現(xiàn)它可以根據(jù)上述方法生成的tags文件來(lái)自動(dòng)補(bǔ)全類型成員。
使用很簡(jiǎn)單,就是在你需要補(bǔ)全類型成員時(shí),按F8鍵就可以拉。它一般第一次使用時(shí),需要讓你確認(rèn)是使用已有的tags文件還是再生成一次。一般我們自己控制生成tags文件的時(shí)機(jī),它就使用就行拉。
但它也受到ctags的分析能力比較差的限制,可能不是每次都能幫到你。
6)使用global
在工程的最上層目錄執(zhí)行命令:
gtags
等待它完成所有需要的global自己格式的tags的生成
生成完后,需要的就是在生成tags的目錄打開(kāi)你的工程的任意文件,用如下命令查詢相關(guān)類型引用和關(guān)聯(lián)關(guān)系:
代碼:
Gtags xxxx 查找xxxx的定義 Gtags -r xxxx 查找xxxx的引用 Gtags -s xxxx 查找xxxx出現(xiàn)的地方
它的提示信息很有顯,不如cscope更直觀,但對(duì)大型分析的比較完整。
有時(shí)它無(wú)法正常分析的類型 可以試試用帶-s 的參數(shù)的方式找找類型定義。再不行,我就不清楚拉
4、草草的收尾
我使用它們也是一點(diǎn)一點(diǎn)的摸索的沒(méi)有系統(tǒng)的完整的使用過(guò),也受限于本人的Linux使用經(jīng)驗(yàn)和工作關(guān)系,所以非常簡(jiǎn)單的使用體會(huì)給大家一個(gè)參考,希望能有所幫助。更希望后來(lái)者能不斷補(bǔ)充相關(guān)的使用體會(huì)。大家都需要交流提高,呵呵。