vim 的 tags 模塊 與 ctags,vimctags
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>
vim裡面建立了tags文件之後用ctrl+t還是總顯示ctags堆棧為空是為何?
關於VIM
ctags
問題
文件夾裡面用了ctags -R
裡面
"startlist"
即使該函數
另
文件
CTRL-] 命令會跳轉
當前光標
vim+ctags只刪除tags中當前xxxc文件的記錄
解決
主要問題
要合理拆分 tags
分布
方案1:
工程太大
利用makefile文件來更新tags哦
應該會寫makefile文件吧
makefile
寫上tags
依賴列表
把tags 拆分
各
模塊下面
樣tags
會像方案2
樣太零散
-------
方案2:
工程目錄下
每
文件夾下都產生
tags文件
vim配置文件
寫上
function Update_ctags()
let l:filepath=expand("%:p:h")
let l:cmd="!cd " . l:filepath . ";ctags -F *"
silent execute l:cmd
endfunc
auto BufWritePost *.c,*.h call Update_ctags()
" 只要寫入文件
會更新文件所
目錄
tags
而
子目錄下
tags
會更新
假設 your_soft_src/
工程根目錄
絕對路徑
" 接下來寫
auto 命令自動設置工程目錄下
tags list
auto bufenter your_soft_src/* so your_soft_src/tags_setting.vim
用
linux命令 生成tags_setting.vim
echo -n "set tags+=">your_soft_src/tags_setting.vim
find your_soft_src -name tags|tr "\n" ",">>your_soft_src/tags_setting.vim