安裝gutentag+ctags+gtags

在常規的使用ctags生成tag標籤文件實現跳轉的方式下,每次需要更新tags文件時都需要手工運行 ctags -R 生成當前項目所有源文件對應的tag標籤文件。

當工程文件多、文件更新頻繁時,上述生成tags文件的方法顯得笨拙、低效

得益於 Vim 8 提供的異步機制,vim插件vim-gutentags能夠自動異步生成 tags 文件,當檢測到同一個工程下面的文件有修改時,gutentags能自動增量更新對應工程的 tags 文件,而不用全部重新生成tags文件,是一個非常高效的tags生成工具。

 

一、vim-gutentags 安裝

1.1 軟件依賴

vim-gutentags的本質仍然是使用ctags生成tag標籤來實現函數跳轉等功能,只是在ctags的基礎上進行了封裝和簡化(具體封裝方式在後文有簡單分析),方便用戶在vim中使用。

由於vim-gutentags依賴ctags工具,因此在使用vim-gutentags插件的系統中必須安裝ctags軟件,否則會報錯"Excutable 'ctags' can't be found."。

ctags安裝

brew install ctags

關於ctags的介紹,可以參考vim教程網上的文章Vim使用ctags實現函數跳轉

osx下gtags的回跳上一次是ctrl+t,進入定義是ctrl+]

其次,vim-gutentags需要在vim8.0以上版本才能正常工作,因爲vim-gutentags實現的是增量更新tags的方式,依賴於vim8提供的異步機制

在低於vim8.0的版本是運行vim-gutentags插件,會報錯"this plugin requires the job API from Vim8 or Neovim"。

關於vim8的編譯和安裝,可以參考vim教程網上的文章vim安裝教程

1.2 gutentags安裝方法

本文介紹使用插件管理器vim-plug安裝HomeBrew以及解決Could not resolve host: raw.githubusercontent.com問題)安裝vim-gutentags插件。vim-plug相比較Vundle,按需加載這點可以簡化vim啓動時間,而且Vundle已經三年沒有更新。

在配置文件 ~/.vimrc 中增加配置項

Plugin 'ludovicchabant/vim-gutentags' 

後再在vim命令行模式下執行命令

 :PlugInstall 

即可完成vim-gutentags插件的安裝。

1.3 另一個強大的搜索工具gtags

不用gtags前有如下幾個問題:

1. 使用vimgrep有侷限性,只能查找具體的文件,不能自動查找所有的子目錄,而且不屬於tags保存自動跳回上一次。

2. ctags查找函數的引用不方便。

安裝完gtags(brew install global),ubuntu推薦源碼安裝

wget http://tamacom.com/global/global-6.6.2.tar.gz
tar xzvf global-6.6.2.tar.gz
cd global-6.6.2
./configure
make && make install

會自動安裝gtags-cscope(一般不會用到,主要還是用Gtags)。

注意需要gtags-cscope.vim  gtags.vim放入~/.vim/plugin。

osx下gtags的回跳上一次是ctrl+shift+o,tab可以補全

主要命令如下:

01.Gtags func:查看定義處 02.Gtags -r func:查看引用處 03.Gtags -s text:查看未被數據庫定義的tags

04.copen:打開quick fix顯示窗口 05.cclose:關閉quick fix顯示窗口 06.cn:下一項

07.cp:上一項 08.cl:列出查詢到的相關項 09.ccN:到列表中第N個符號處

10.Gtags -g pattern:搜索pattern指定的字符串 11.Gtags -gie -pattern:-e選項可以用於搜索’-‘字符,但是基礎搜索,沒有元字符,-i選項忽略大小寫,類似於grep的選項

12.GtagsCuorsor:取決於光標位置,要是在定義處,查詢其引用,要是在引用處,跳轉至其定義處,否則就是Gtags -s命令 13.Gtags -P text:查詢包含text的路徑名,Gtags -P後接/dir/爲列出叫做dir目錄下文件,後接\.h$列出所有的include文件

14.Gtags -f file:列出file裏的符號,Gtags -f %則列出當前文件的符號

二、vim-gutentags配置介紹和原理分析

vim-gutentags插件的基本工作原理可以這麼理解:首先確定vim當前打開的文件是否需要自動生成tags標籤,若需要則通過某種方式確定tag文件的路徑,再基於tag標籤文件完成函數跳轉、結構體定義跳轉等功能。

因此,vim-gutentags需要確定是否需要生成tags標籤文件,又需要告訴ctags軟件自身生成的tags文件的具體路徑信息 (因爲從Vim使用ctags實現函數跳轉一文已知,默認情況下,生成的tags文件必須在vim運行的當前目錄才能在vim裏面正確跳轉)。

2.1 gutentags配置

爲了提供上述信息給vim-gutentags,安裝完gutentags後,需要在vim配置文件中增加以下必要的配置項。

" gutentags搜索工程目錄的標誌,碰到這些文件/目錄名就停止向上一級目錄遞歸 "
let g:gutentags_project_root = ['.tags']

" 所生成的數據文件的名稱 "
let g:gutentags_ctags_tagfile = '.tags'

" 同時開啓 ctags 和 gtags 支持:
let g:gutentags_modules = []
if executable('ctags')
    let g:gutentags_modules += ['ctags']
endif
if executable('gtags-cscope') && executable('gtags')
    let g:gutentags_modules += ['gtags_cscope']
endif
" 將自動生成的 tags 文件全部放入 ~/.cache/tags 目錄中,避免污染工程目錄 "
let s:vim_tags = expand('~/.cache/tags')
let g:gutentags_cache_dir = s:vim_tags
" 檢測 ~/.cache/tags 不存在就新建 "
if !isdirectory(s:vim_tags)
   silent! call mkdir(s:vim_tags, 'p')
endif

" 配置 ctags 的參數,老的 Exuberant-ctags 不能有 --extra=+q,注意
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']

" 如果使用 universal ctags 需要增加下面一行,老的 Exuberant-ctags 不能加下一行
let g:gutentags_ctags_extra_args += ['--output-format=e-ctags']

" 禁用 gutentags 自動加載 gtags 數據庫的行爲
let g:gutentags_auto_add_gtags_cscope = 0
  • 變量 gutentags_project_root 是vim-gutentags提供的用於搜索工程目錄的標誌,gutentags插件啓動後,會從文件當前路徑遞歸往上查找 gutentags_project_root 中指定的文件或目錄名,直到第一次找到對應目標文件或目錄名停止。若沒有找到 gutentags_project_root 變量指定的文件或目錄名,則gutentags不會生成tag文件。
  • 變量 gutentags_ctags_tagfile 和 gutentags_cache_dir 分別用於告訴ctags要使用的tag文件目錄和tag文件名後綴,tag文件名的生成規則默認是根據生成tag文件的工程絕對路徑按 - 分割而成
  • 變量 gutentags_ctags_extra_args 用於配置ctags生成tag標籤的參數,具體參數含義可參考文章ctags參數介紹

以及修改plugin/gutentags.vim 去除.git配置

所以,上面的gutentags配置指定了從當前路徑向上遞歸查找是否有 .root、.svn、 .git、.project 等標誌性文件來確定當前文檔所屬的工程目錄;而ctags要使用的tag標籤文件的路徑爲 ~/.cache/tags,文件後綴爲 .tags

ctags 軟件需要使用命令 :set tags+=tags文件路徑 顯式地指定tag文件路徑,從文件 ~/plugged/vim-gutentags/autoload/gutentags/ctags.vim 可以看出,gutentags執行了命令 setlocal tags+= 來添加變量 gutentags_ctags_tagfile 指定的tag文件到局部 tags 搜索列表中。

2.2 gutentags示例

安裝了gutentags並且進行了上面的設置後,平時打開vim編輯文件基本感覺不到 tags 文件的生成過程了,只要文件修改過,gutentags 都在後臺默默分析是否需要更新數據文件,還會幫你:setlocal tags+=... 添加到局部 tags 搜索列表中。得益於 Vim 8 的異步機制,你可以任意隨時使用 ctags 相關功能,並且數據庫都是最新的。

就像下面的vim視頻教程一樣,假設已經在vim配置文件中添加了上面的配置項,在當前目錄新建文件 .project 後再打開當前目錄下的任意文件,再退出vim後可以看到,gutentags已經爲當前目錄生成了tags文件 ~/.cache/tags/home-vim-vim.ink-libevent-.tags

需要注意的是,gutentags 需要靠上面定義的 gutentags_project_root 判斷文件所在的工程,如果一個文件沒有保存在包含 .git.svn.root等 定義在 gutentags_project_root 中的文件,gutentags就不會爲該文件生成 tags。

想要避免的話,你可以在你的野文件目錄中放一個名字爲 .root 的空白文件,主動告訴 gutentags 這裏就是工程目錄

2.3 基於gutentags實現跳轉

在爲當前目錄生成tags文件後,可以通過按鍵 Ctrl + ] 跳轉到對應的定義位置,再使用命令 Ctrl + o 回退到原來的位置。關於跳轉的具體應用,可以參考Vim使用ctags實現函數跳轉

 

注意:修改YouCompleteMe不進行語法分析,爲了跟ctags配套使用自動補全。YouCompleteMe的安裝請看https://blog.csdn.net/u012332571/article/details/38540987

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章