程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> vim 的 tags 模塊 與 ctags,vimctags

vim 的 tags 模塊 與 ctags,vimctags

編輯:C++入門知識

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堆棧為空是為何?

關於VIMctags問題文件夾裡面用了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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved