2016年5月14日 星期六

Trace code的利器 vim + ctags + gtags(+cscope)

Trace code最重要的就是跳進函式跟列出函式或變數所使用的地方
雖然lxr就可以搞定 但每到一個新環境設定感覺還蠻麻煩的
所以我整理出最快可以完成以上功能的工具與方法

ctags參考:

$ sudo apt-get install exuberant-ctags
$ cd project/
$ ctags -R *

主要就是安裝exuberant-ctags 然後將project下所有資料夾的變數都建立索引

gtags
參考:

$ sudo apt-get install global

$ cd project/
(  $ find . -name "*.[ch]" > gtags.files  )
$ gtags

更改檔案  ~/.vimrc 加上以下兩行 讓gtags可以取代cscope 跟vim整合

set cscopeprg=gtags-cscope
cs add GTAGS

如果code有再更新 只要執行以下指令便可更新索引

$ global -u

cscope+vim參考:

更改檔案  ~/.vimrc 加上以下幾行
nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>

這邊是為了在vim裡使用快速鍵ctrl+\ 然後輸入s或g等指令呼叫cscope
如此便可以不用每次打:cs find s等指令

有了以上的三個元件設定 就能讓vim使用索引跳轉函式跟變數的功能了

例如看到一個函式或變數 就可以用ctrl+] 跳進函式的內容 ctrl+t跳回來
或是輸入ctrl+\後 按s, g, c....等指令 得到結果後一樣可以用ctrl+t跳回來


----------------

但是這個方法有個問題 就是他會用你開啟的檔案目錄為主要搜尋目錄

意思是假設你的project資料夾底下有sub_folder1跟sub_folder2

project
\---- sub_folder1
\--------aaa.c
\---- sub_folder2
\--------bbb.c
如果你把ctags和gtags的資料建在project目錄底下
則如果執行
$ cd project
$ vim sub_folder1/aaa.c 
就沒問題

但是如果你執行
$ cd project
$ cd sub_folder1
$ vim aaa.c
就會有問題 會找不到ctags跟gtags的檔案

因此這裡有人提出一個patch
http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=342099

但如果不改vim就還是乖乖的從project根目錄開檔案吧....