vim 的 tags 模塊 與 ctags


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> 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM