2016年8月19日 星期五

global/gtags with vim

應 l 君要求放上 DD 圖

vim + ctags + cscope 應該是查到爛的組合, 基本上是 linux 環境下 Source Insight 的替代品, 我使用 vim 多年, 從沒有把這組合技練成過, 只用過 ctags, 記住僅僅的 ctrl+], ctrl+t 兩個組合鍵, 在瀏覽程式碼就省下不少功夫, 可惜要 reference 那個 function 使用了那個變數/函式, 還是得靠 grep, 過了這麼多年, 終於可以靠 global 取代 ctags + cscope, 也不用改變 ctrl+], ctrl+t 這兩個組合鍵的使用習慣。

descent@u64:simple_compiler$ 
find . -name "*.h" -o -name "*.cpp" > gtags.files

cat gtags.files 
./token.h
./parser.h
./mytype.h
./astnode.h
./lexer.h
./op.h
./env.h
./env.cpp
./c_parser.cpp
./lexer.cpp
./op.cpp
./token.cpp
./astnode.cpp

$ gtags

建立 gtags.files 再按下 gtags (不用建立 gtags.files 也可以) 就會產生 tag 檔案了。

複製 gtags.vim (global 套件提供) 到 ~/.vim/plugin/, 在最後面加入 list 1 的 hot key 定義。最主要就是

:Gtags -s abc - 找誰用了 abc 這個函式
:Gtags -r xyz - 找誰用了 xyz 這個變數

list 1. ~/.vim/plugin/gtags.vim
451 map <C-n> :cn<CR>
452 map <C-p> :cp<CR>
455 nnoremap <C-\> :exec("Gtags -r ".expand("<cword>"))<cr>
456 nnoremap <C-m> :exec("Gtags -s ".expand("<cword>"))<cr>

在 ~/.vim/vimrc 加入 list 2 內容, 最主要是相容於 ctags 的 hot key, 原有的習慣就不用改變。

list 2. ~/.vim/vimrc
64 set cscopeprg=gtags-cscope
65 "set cs add GTAGS
66
67 let s:command = "cs add GTAGS"
68 exe s:command

在某個 function 按下 ctrl+], ctrl+t 一樣是原來 ctags 的功能, 然後在某個 function 按下, crtl+\, 神奇的事情就發生了, 會跳到用這個函式的地方 (如同 fig 1),然後 ctrl+n, ctrl+p 是上一個, 下一個。

如果是 symbaol (變數) 就用 ctrl+m, 沒問題吧 \ 是函式, m 是對付變數。如果不喜歡 \, m, 參考 list 1 改成自己喜歡的按鍵。

fig 1. eval 出現的地方

只要有這 4 個按鍵, 看 code 就輕鬆多了, 只要 4 個, 你不會記不住吧! 好吧! 你可能還需要 ctrl+w+up/down 來切換視窗, 會需要在多記住幾個按鍵。

感謝 irc l 君友情支援 vim script。

不過我沒搞定怎麼跳到 symbol definition, 所以現在還是搭配著 ctags 一起用, 實在是太蠢了。

這裡有個方便的 vim plugin, 不過我不會用, 才自己搞。
https://github.com/tranngocthachs/gtags-cscope-vim-plugin

ref:

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。