1. 概述
一般來說,在代碼中跳轉,離不開 ctags。
實際上,vim 中代碼跳轉是由 vim tags 模塊完成的,tags 模塊依賴於 tags 文件。
ctags(Generate tag files for source code) 是產生 tags 文件的。
tags 文件只包含了函數、類、變量的定義的信息,而沒有包含使用信息。
如果要知道一個函數都在什么地方使用過,需要使用 cscope。
2. tags 文件的生成與更新
ctags 默認是不會自動生成 ctags 文件的,常用的 3 個生成命令如下:
$ ctags * $ ctags -R $ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
- -R: 循環生成子目錄的 tags
- *: 當前目錄下的所有文件,不遞歸
- –c++-kinds=+px : 記錄 c++ 文件中的函數聲明和各種外部和前向聲明
- –fields=+iaS : ctags 要求描述的信息,其中i表示如果有繼承,則標識出父類;a 表示如果元素是類成員的話,要標明其調用權限(即是 public 還是 private);S 表示如果是函數,則標識函數的 signature。
- –extra=+q: 強制要求ctags做如下操作—如果某個語法元素是類的一個成員,ctags默認會給其記錄一行,可以要求ctags對同一個語法元素再記一行,這樣可以保證在VIM中多個同名函數可以通過路徑不同來區分。
3. 常見功能與快捷鍵
詳細的說明,見 vim 的 tags 幫助文檔。
:help tags
命令、快捷鍵、功能描述如下:
- CTRL+] :tag tagname 跳轉到定義處
- CTRL-W ] :stag tagname 新窗口中打開並跳轉到定義處。split 后執行 tag tagname
- CTRL+T CTRL+] 的反操作,向回跳轉。類似 CTRL+o,區別在於,CTRL+o 的跳轉不局限於 CTRL+] 構成的調用樹。
對於存在多個匹配的 tag(如, 在 .h 和 .cpp 中都聲明或者定義的方法名):
- :ts[elect] 列出所有匹配的 tag
- :[count]tp[revious] 跳轉至前 count 個 tag 處。
- :[count]tn[ext] 跳轉至后 count 個 tag 處。
4. Vim + ctags 配置
set tags=tags; " ; 不可省略,表示若當前目錄中不存在tags, 則在父目錄中尋找。 map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>