资讯专栏INFORMATION COLUMN

`Leaderf gtags`:模糊匹配与最强静态符号索引工具的完美结合

hsluoyz / 1605人阅读

摘要:也就是,是一个非常强大的源码符号索引工具。韦大的中符号索引篇对有比较详细的介绍,本文再做一些补充。的最新版本已经是,该版本了韦大文中提到的下面文件名大小写的。

Gtags

Gtags也就是GNU GLOBAL,是一个非常强大的源码符号索引工具。它通过建立索引数据库,不但可以查找函数的定义,还可以查找函数的所有引用(被调用的地方);而且它还可以增量地更新索引数据库,当代码有所改变时,它可以在很短的时间内更新索引数据库,保持索引数据库和代码同步。
韦大的 Vim 8 中 C/C++ 符号索引:GTags 篇 对 gtags 有比较详细的介绍,本文再做一些补充。

GLOBAL-6.6.3 released

Gtags的最新版本已经是6.6.3,该版本 fix了韦大文中提到的 Windows下面文件名大小写的 bug。

在 Linux上,不配置let $GTAGSCONF = "/path/to/share/gtags/gtags.conf"也可以正常工作。

当项目文件的路径包含非ASCII字符时,使用pygments会报UnicodeEncodeError: "latin-1" codec can"t encode characters in position 5-8: ordinal not in range(256)

自动生成Gtags索引数据库

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 数据库依然可以自动更新。

Leaderf gtags 使用介绍

具体使用方法可以用:Leaderf gtags -h来查看。

usage:
Leaderf[!] gtags [-h] [--remove] [--recall]
Leaderf[!] gtags --update [--gtagsconf ] [--gtagslabel 

注意:如果:Leaderf后面有感叹号,会直接进入normal模式;如果没有感叹号,则是输入模式,此时可以输入字符来进行模糊匹配过滤。可以用tab键在两个模式间来回切换。

手动生成gtags数据库
Leaderf[!] gtags --update [--gtagsconf ] [--gtagslabel 

此命令完全异步,不会卡住你的UI。

--gtagsconf

用来指定 gtags.conf 文件的路径,一般情况下不需要指定,默认值就可以很好地工作。对于Windows上,如果相对于gtags.exe所在路径有../share/gtags/gtags.conf,也不需要指定该选项。如果需要用户自己特有的针对 gtags 的配置,可以指定用户的配置文件。

也可以在vimrc里设置g:Lf_Gtagsconf达到同样的目的。

--gtagslabel

用来指定gtagslabel,如果不指定,默认值是 "default"是 gtags.conf 中的:

default
使用内置parser,只支持 6 种语言(C,C++,Java,PHP4,Yacc,汇编)。

ctags
使用exuberant-ctags作为语言parser,支持 40+ 种语言,只能生成定义索引不能生成引用索引。

new-ctags
使用universal-ctags作为语言parser,支持 100+ 种语言,只能生成定义索引不能生成引用索引。虽然貌似universal-ctags已经支持生成引用tags,但是依然不能配合gtags工作(见这里),我也试了各种操作都没成功,也许是因为这个PR没有被merge。

pygments
使用pygments作为语言parser,号称支持300+种语言。

native-pygments
对于原生支持的6种语言使用内置parser,其他语言使用pygments作为parser。

等等

也可以在`vimrc`里设置`g:Lf_Gtagslabel`达到同样的目的。

--gtagslibpath [ ...]

用来指定项目所用 library 的 Paths,这样就可以生成 library 的索引,查找定义或引用时可以跳转到 library 代码中去。后面指定的路径还可以是一个或多个其他项目路径,跳转时可以跳到其他项目中的文件。

查找tags
Leaderf[!] gtags [--current-buffer | --all-buffers | --all] [--result ] [COMMON_OPTIONS]

此命令可以列出当前buffer、所有打开的buffer或者整个项目的tags。

Leaderf[!] gtags等同于Leaderf[!] gtags --all,列出整个项目的tags。

--result 指定显示格式,可以是ctags(default), ctags-x或者ctags-mod

ctags格式

ctags-x格式

ctags-mod格式

查找定义、引用
Leaderf[!] gtags -d  [--auto-jump []] [-i] [--literal] [--path-style ] [-S ]
                 [--append] [--match-path] [--gtagsconf ] [--gtagslabel 

可以是正则表达式。

--auto-jump [] 意思是如果只有一个结果直接跳过去。

其他

Leaderf[!] gtags -g 功能已被Leaderf rg包含。

Leaderf gtags --nextLeaderf gtags --previous相当于quickfix的:cnext:cprevious命令,在LeaderF结果窗口关闭的情况下也可以使用。

更多内容请参考:Leaderf gtags -h 和 doc。

使用示例
let g:Lf_GtagsAutoGenerate = 1
let g:Lf_Gtagslabel = "native-pygments"
noremap fr :=printf("Leaderf! gtags -r %s --auto-jump", expand(""))
noremap fd :=printf("Leaderf! gtags -d %s --auto-jump", expand(""))
noremap fo :=printf("Leaderf! gtags --recall %s", "")
noremap fn :=printf("Leaderf gtags --next %s", "")
noremap fp :=printf("Leaderf gtags --previous %s", "")

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25115.html

相关文章

  • 让人相见恨晚vim插件:模糊查找神器LeaderF

    摘要:是什么是一个用写的插件,可以在成千上万数十万个文件中,通过模糊查找的方式,快速找到目标文件。它还有很多衍生功能快速打开或定位某个最近使用的文件包括函数类变量等命令历史文件中的某一行的等等。友情链接,也許是最好的模糊查詢插件 提到vim的模糊查找插件,很多人第一反应是ctrlp.vim,ctrlp知名度很高,但跟其它的同类插件相比,它的唯一优点是用vimL编写(这让它的性能是所有同类插件...

    Near_Li 评论0 收藏0
  • vim模糊查找插件LeaderF新功能介绍

    摘要:前言上一篇文章让人相见恨晚的插件模糊查找神器概括性的介绍了的基本功能,本篇对的新功能做一下介绍。空格分隔的每个子串都是对整个字符串的模糊匹配,而不是精确匹配。 前言 上一篇文章《让人相见恨晚的vim插件:模糊查找神器LeaderF》概括性的介绍了LeaderF的基本功能,本篇对LeaderF的新功能做一下介绍。 统一的命令接口 随着LeaderF功能的不断增多,LeaderF的命令也在...

    junnplus 评论0 收藏0
  • 众里寻她千百度--正则表达式

    摘要:如果经过一系列输入,最终如果能达到状态,则输入内容一定满足正则表达式。正则表达式可以转换为,已经有成熟的算法实现这一转换。不过有时候转换为可能导致状态空间的指数增长,因此直接用识别正则表达式。 原文地址 先来看一个让人震撼的小故事,故事来自知乎问题PC用户的哪些行为让你当时就震惊了? 同学在一个化妆品公司上班,旁边一个大妈(四十多岁)发给他一个exl表,让他在里面帮忙找一个经销商的资料...

    golden_hamster 评论0 收藏0
  • Java面试 32个核心必考点完全解析

    摘要:如问到是否使用某框架,实际是是问该框架的使用场景,有什么特点,和同类可框架对比一系列的问题。这两个方向的区分点在于工作方向的侧重点不同。 [TOC] 这是一份来自哔哩哔哩的Java面试Java面试 32个核心必考点完全解析(完) 课程预习 1.1 课程内容分为三个模块 基础模块: 技术岗位与面试 计算机基础 JVM原理 多线程 设计模式 数据结构与算法 应用模块: 常用工具集 ...

    JiaXinYi 评论0 收藏0
  • Elasticsearch实践(三):Mapping

    摘要:分词过大会导致磁盘空间占用大。注意生成后是不允许修改包括删除的。在旧的里这两个类型由表示。这将有助于索引和搜索更有效。示例日期类型类型为。假设字段被禁用,则搜索请求和查询将无法将其用于查询。将在中完全删除。 版本:Elasticsearch 6.2.4。 Mapping类似于数据库中的表结构定义,主要作用如下: 定义Index下字段名(Field Name) 定义字段的类型,比如数值...

    LiveVideoStack 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<