標籤:style blog color 使用 檔案 for
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>