天天看點

vim + ctags + taglist + cscope + cppcomplete + global 使用初探

由于本人比較喜歡在終端狀态下的vim,是以gvim下的擴充使用的不多。這裡介紹的也是我簡單的使用以上擴充的一點點體會。請大家指正。 emacs 不會用,也沒有比較過拉。

1、大體感覺,(因為使用時間不長,不全面)

總體使用的感覺定位查找類型定義基本可以用,但自動補全類型方面由于ctags的功能有限,感覺在大工程時,不一定很好用。

大型程式一定要global的參與,它的分析比較全面,但在vim中的提示資訊有限。

taglist 精幹,需要ctags的支撐,直接可以在左邊列出函數清單,全局參數清單。(可以排序)

cscope 比較強大,可以對函數以及部分類型定義進行跳轉,但有些BUG,好像在某些條件下無法正确找到分析枚舉的定義。

cppcomplete 需要ctags的支撐,可以補全類型或者函數名(可不是普通Ctrl+P/N的那種)

global 新版本可以嵌入vim使用,提供比較完整解析和類型索引,和cscope比,稍微差些的就是對類型引用的列印清單中沒有辨別這個引用在什麼函數中進行的。其實我的感覺global可能不是為vim所生,它的主要目的是用html的方式進行表達相關的關聯關系和索引,使用起來感覺沒有cscope的那麼貼切。

2、相關的擴充的安裝

代碼:

apt-get install exuberant-ctags cscope global

cppcomplete 和 taglist 要到www.vim.org的擴充清單中下載下傳。

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的擴充,将它也拷貝到 $HOME/.vim/plugin

debian sid 版本global安裝後擴充檔案在

/usr/share/doc/global/examples/gtags.vim.gz

需要拷貝到$HOME/.vim/plugin後解壓,解壓方法:

gzip -d gtags.vim.gz

3、使用這些工具

1)準備工作,先修改一下$HOME/.vimrc檔案

為了更好的使用cscope請添加如下内容,這樣Ctrl-]的跳轉将由cscope的tags進行分析。

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生成最簡單的方法是:

在你的開發工程的最上層目錄執行cscope-indexer,它會周遊下面的所有目錄,生成兩個檔案,一個是cscope.files,這個檔案記錄需要生成tags的檔案名,可以手工修改,另一個是cscope格式的tags檔案cscope.out。

完成後,你在生成了cscope.out的目錄打開工程的任意檔案,就可以使用Ctrl-]跳轉查找類型定義了。

cs f s xxxx 查找xxxx出現的地方,它能詳細列出哪些檔案的哪行的哪個函數引用,以及該行的内容,比較不錯。 :)

它的所有指令的使用請參考:

help cscope

3)使用taglist

taglist的功能是即時生成目前檔案的函數清單和全局變量清單,便于索引。

在vim中指令模式下使用

Tlist 打開或者關閉目前檔案的索引;

TlistSync 立即在打開的索引視窗中定位目前的光标所在位置屬于哪個函數或者結構定義中。

還有其他指令,請參考它的幫助檔案。

4)ctags的使用

其實cscope是用來替代ctags功能的,ctags的應用廣泛,還有其他很多的軟體依賴它。

例如要生成cppcomplete需要的tags檔案的話,需要運作下面的指令:

ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files

注意,我在最後使用了參數"-L cscope.files" 這僅僅是借用拉cscope生成的檔案索引來幫助ctags去查詢相關工程檔案生成tags。

5)使用cppcomplete

cppcomplete的使用我隻是簡單的發現它可以根據上述方法生成的tags檔案來自動補全類型成員。

使用很簡單,就是在你需要補全類型成員時,按F8鍵就可以拉。它一般第一次使用時,需要讓你确認是使用已有的tags檔案還是再生成一次。一般我們自己控制生成tags檔案的時機,它就使用就行拉。

但它也受到ctags的分析能力比較差的限制,可能不是每次都能幫到你。

6)使用global

在工程的最上層目錄執行指令:

gtags

等待它完成所有需要的global自己格式的tags的生成

生成完後,需要的就是在生成tags的目錄打開你的工程的任意檔案,用如下指令查詢相關類型引用和關聯關系:

Gtags xxxx 查找xxxx的定義 Gtags -r xxxx 查找xxxx的引用 Gtags -s xxxx 查找xxxx出現的地方

它的提示資訊很有顯,不如cscope更直覺,但對大型分析的比較完整。

有時它無法正常分析的類型 可以試試用帶-s 的參數的方式找找類型定義。再不行,我就不清楚拉

4、草草的收尾

我使用它們也是一點一點的摸索的沒有系統的完整的使用過,也受限于本人的Linux使用經驗和工作關系,是以非常簡單的使用體會給大家一個參考,希望能有所幫助。更希望後來者能不斷補充相關的使用體會。大家都需要交流提高,呵呵。

繼續閱讀