Gtags也就是GNU GLOBAL,是一个很是强大的源码符号索引工具。它经过创建索引数据库,不但能够查找函数的定义,还能够查找函数的全部引用(被调用的地方);并且它还能够增量地更新索引数据库,当代码有所改变时,它能够在很短的时间内更新索引数据库,保持索引数据库和代码同步。
韦大的 Vim 8 中 C/C++ 符号索引:GTags 篇 对 gtags 有比较详细的介绍,本文再作一些补充。html
Gtags的最新版本已是6.6.3,该版本 fix了韦大文中提到的 Windows下面文件名大小写的 bug。linux
let $GTAGSCONF = '/path/to/share/gtags/gtags.conf'
也能够正常工做。UnicodeEncodeError: 'latin-1' codec can't encode characters in position 5-8: ordinal not in range(256)
LeaderF 能够本身管理 gtags 数据库(GTAGS,GRTAGS,GPATH),它不会在你的项目目录下生成任何额外的文件或目录。gtags 数据库文件存储在$HOME/.LfCache/gtags/%PATH%OF%YOUR%PROJECT/
下面, %PATH%OF%YOUR%PROJECT
是把你项目路径中的 \
或 /
替换成 %
。
只要设置let g:Lf_GtagsAutoGenerate = 1
, LeaderF 就会在打开第一个文件时自动生成 gtags 数据库。当代码有更改而且已经有 gtags 数据库生成时,更改的代码会自动同步到 gtags 数据库(即便g:Lf_GtagsAutoGenerate
是0)。
只有在项目根目录下有g:Lf_RootMarkers
(默认值是['.git', '.hg', '.svn']
)里面指定的文件或目录时,LeaderF 才会自动生成 gtags 数据库;不然只能手动生成 gtags 数据库:Leaderf gtags --update
,可是当代码有更改时,gtags 数据库依然能够自动更新。git
具体使用方法能够用:Leaderf gtags -h
来查看。github
usage: Leaderf[!] gtags [-h] [--remove] [--recall] Leaderf[!] gtags --update [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [--accept-dotfiles] [--skip-unreadable] [--skip-symlink [<TYPE>]] [--gtagslibpath <PATH> [<PATH> ...]] Leaderf[!] gtags [--current-buffer | --all-buffers | --all] [--result <FORMAT>] [COMMON_OPTIONS] Leaderf[!] gtags -d <PATTERN> [--auto-jump [<TYPE>]] [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS] Leaderf[!] gtags -r <PATTERN> [--auto-jump [<TYPE>]] [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS] Leaderf[!] gtags -s <PATTERN> [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS] Leaderf[!] gtags -g <PATTERN> [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS] Leaderf[!] gtags --by-context [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS] [COMMON_OPTIONS]: [--reverse] [--stayOpen] [--input <INPUT> | --cword] [--top | --bottom | --left | --right | --belowright | --aboveleft | --fullScreen] [--nameOnly | --fullPath | --fuzzy | --regexMode] [--nowrap] optional arguments: -h, --help show this help message and exit specific arguments: --update Create tag files if tag files do not exist, update the tag files otherwise. --remove Remove the tag files generated. --accept-dotfiles Accept files and directories whose names begin with a dot. By default, gtags ignores them. --skip-unreadable Skip unreadable files. --gtagsconf <FILE> Set environment variable GTAGSCONF to <FILE>. --gtagslabel <LABEL> Set environment variable GTAGSLABEL to <LABEL>. --skip-symlink [<TYPE>] Skip symbolic links. If type is 'f' then skip only symbolic links for file, else if 'd' then skip only symbolic links for directory. The default value of type is 'a' (all symbolic links). --gtagslibpath <PATH> [<PATH> ...] Specify the paths to search for library functions. -d <PATTERN>, --definition <PATTERN> Show locations of definitions. -r <PATTERN>, --reference <PATTERN> Show reference to a symbol which has definitions. -s <PATTERN>, --symbol <PATTERN> Show reference to a symbol which has no definition. -g <PATTERN>, --grep <PATTERN> Show all lines which match to the <PATTERN>. --by-context Decide tag type by context at cursor position. If the context is a definition of the pattern then use -r, else if there is at least one definition of the pattern then use -d, else use -s. Regular expression is not allowed for pattern. -i, --ignore-case Ignore case distinctions in the pattern. --literal Execute literal search instead of regular expression search. --path-style <FORMAT> Show path names using <FORMAT>, which may be one of: `relative`, `absolute`, `shorter`, `abslib` or `through`. `relative` means relative path. `absolute` means absolute path. `shorter` means the shorter one of relative and absolute path. `abslib` means absolute path for libraries (GTAGSLIBPATH) and relative path for the rest. `through` means the relative path from the project root directory (internal format of GPATH). The default is `relative`. -S <DIR>, --scope <DIR> Show only tags which exist under <DIR> directory. --recall Recall last search. If the result window is closed, reopen it. --match-path Match the file path when fuzzy searching. --append Append to the previous search results. --current-buffer Show tags in current buffer. --all-buffers Show tags in all listed buffers. --all Show tags in the whole project. --result <FORMAT> Show result using format, which may be one of: `ctags`(default), `ctags-x`, `ctags-mod`. --auto-jump [<TYPE>] Jump to the tag directly when there is only one match. <TYPE> can be 'h', 'v' or 't', which mean jump to a horizontally, vertically split window, or a new tabpage respectively. If <TYPE> is omitted, jump to a position in current window. common arguments: --reverse show results in bottom-up order --stayOpen don't quit LeaderF after accepting an entry --input <INPUT> specifies INPUT as the pattern inputted in advance --cword current word under cursor is inputted in advance --top the LeaderF window is at the top of the screen --bottom the LeaderF window is at the bottom of the screen --left the LeaderF window is at the left of the screen --right the LeaderF window is at the right of the screen --belowright the LeaderF window is at the belowright of the screen --aboveleft the LeaderF window is at the aboveleft of the screen --fullScreen the LeaderF window takes up the full screen --nameOnly LeaderF is in NameOnly mode by default --fullPath LeaderF is in FullPath mode by default --fuzzy LeaderF is in Fuzzy mode by default --regexMode LeaderF is in Regex mode by default --nowrap long lines in the LeaderF window won't wrap --next Jump to the next result. --previous Jump to the previous result. If [!] is given, enter normal mode directly.
注意:若是:Leaderf
后面有感叹号,会直接进入normal模式;若是没有感叹号,则是输入模式,此时能够输入字符来进行模糊匹配过滤。能够用tab键在两个模式间来回切换。正则表达式
Leaderf[!] gtags --update [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [--accept-dotfiles] [--skip-unreadable] [--skip-symlink [<TYPE>]] [--gtagslibpath <PATH> [<PATH> ...]]
此命令彻底异步,不会卡住你的UI。数据库
--gtagsconf <FILE>
用来指定 gtags.conf 文件的路径,通常状况下不须要指定,默认值就能够很好地工做。对于Windows上,若是相对于gtags.exe
所在路径有../share/gtags/gtags.conf
,也不须要指定该选项。若是须要用户本身特有的针对 gtags 的配置,能够指定用户的配置文件。express
也能够在vimrc
里设置g:Lf_Gtagsconf
达到一样的目的。vim
--gtagslabel <LABEL>
bash
用来指定gtagslabel,若是不指定,默认值是 'default'
。<LABEL>
是 gtags.conf 中的:app
也能够在`vimrc`里设置`g:Lf_Gtagslabel`达到一样的目的。
--gtagslibpath <PATH> [<PATH> ...]
用来指定项目所用 library 的 Paths,这样就能够生成 library 的索引,查找定义或引用时能够跳转到 library 代码中去。后面指定的路径还能够是一个或多个其余项目路径,跳转时能够跳到其余项目中的文件。
Leaderf[!] gtags [--current-buffer | --all-buffers | --all] [--result <FORMAT>] [COMMON_OPTIONS]
此命令能够列出当前buffer、全部打开的buffer或者整个项目的tags。
Leaderf[!] gtags
等同于Leaderf[!] gtags --all
,列出整个项目的tags。--result <FORMAT>
指定显示格式,能够是ctags
(default), ctags-x
或者ctags-mod
。
Leaderf[!] gtags -d <PATTERN> [--auto-jump [<TYPE>]] [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS] Leaderf[!] gtags -r <PATTERN> [--auto-jump [<TYPE>]] [-i] [--literal] [--path-style <FORMAT>] [-S <DIR>] [--append] [--match-path] [--gtagsconf <FILE>] [--gtagslabel <LABEL>] [COMMON_OPTIONS]
<PATTERN>
能够是正则表达式。--auto-jump [<TYPE>]
意思是若是只有一个结果直接跳过去。Leaderf[!] gtags -g <PATTERN>
功能已被Leaderf rg
包含。Leaderf gtags --next
和 Leaderf gtags --previous
至关于quickfix的:cnext
和:cprevious
命令,在LeaderF结果窗口关闭的状况下也可使用。:Leaderf gtags -h
和 doc。let g:Lf_GtagsAutoGenerate = 1 let g:Lf_Gtagslabel = 'native-pygments' noremap <leader>fr :<C-U><C-R>=printf("Leaderf! gtags -r %s --auto-jump", expand("<cword>"))<CR><CR> noremap <leader>fd :<C-U><C-R>=printf("Leaderf! gtags -d %s --auto-jump", expand("<cword>"))<CR><CR> noremap <leader>fo :<C-U><C-R>=printf("Leaderf! gtags --recall %s", "")<CR><CR> noremap <leader>fn :<C-U><C-R>=printf("Leaderf gtags --next %s", "")<CR><CR> noremap <leader>fp :<C-U><C-R>=printf("Leaderf gtags --previous %s", "")<CR><CR>