在emacs中使用GNU Global的配置指南
1 引言
本文主要针对emacs中的global的配置和使用方法做了简要介绍。global是代码标签化索引工具,能够在许多源码中快速定位函数的实现位置。我主要使用global来辅助代码跳转;还有一种用法是用来辅助代码补全,目前正在研究中。
2 GNU Global相关介绍
global是一个源代码标签索引系统,它的特点如下:
- 编辑器中立
- 能够区分代码中的“定义”和“引用”
global的内置解析器能够完成C, C++, Yacc, Java, PHP4和汇编的语法解析;也可以通过插件拓展完成很多其他语言的解析。
3 GNU Global基本用法
直接在源文件的根目录中运行gtags,就会生成索引文件。
- GTAGS : 定义
- GRTAGS : 引用
- GPATH : 路径
生成索引文件后,使用global指令就可以完成代码的索引。
4 GNU Global高级用法
高级用法主要涉及对系统的头文件目录中的文件进行索引。
系统头文件目录通常来说是只读的,而且我们也不希望产生的临时文件污染系统头文件目录。可以通过修改 MAKEOBJDIRPREFIX
和 GTAGSLIBPATH
等环境变量实现。但是目前我还没有研究出来正确的使用方法。
我目前的方法是通过创建系统头文件目录的软链接到工程目录,这样gtags在生成索引数据库时就能够扫描系统头文件目录了。
5 Windows下的Global使用技巧
对于unix系统来说,一般通过自带的包管理器完成global的安装,这时global是能够直接从命令行调用的。而对于windows系统来说,我下载的是软件压缩包,在解压后需要将可执行文件的目录加入到系统环境变量 PATH
中。这样就能够通过任意一个命令行工具调用global。
同理,后续在emacs中的使用也方便很多。我之前也尝试过使用lisp调用 setenv
接口将global运行目录添加到环境变量中,但是并不奏效。
6 在emacs中使用global
global作为GNU系列软件,已经为emacs提供了插件,在软件发布时的压缩包中就能找到,文件名为 gtags.el
。但是,我推荐使用helm gtags作为global的交互接口。
我的emacs配置如下:
(use-package helm-gtags
:after (helm)
:init
(add-hook 'c-mode-hook 'helm-gtags-mode)
(add-hook 'c++-mode-hook 'helm-gtags-mode)
(add-hook 'asm-mode-hook 'helm-gtags-mode)
:config
;; customize
(custom-set-variables
'(helm-gtags-path-style 'relative)
'(helm-gtags-ignore-case t)
'(helm-gtags-auto-update t))
:bind
(:map helm-gtags-mode-map
("M-t" . helm-gtags-find-tag)
("M-r" . helm-gtags-find-rtag)
("M-s" . helm-gtags-find-symbol)
("M-," . helm-gtags-previous-history)
("M-." . helm-gtags-next-history)))
以上配置实现的效果:
- 在
c-mode
,c++-mode
和asm-mode
中开启helm-gtags
- 匹配结果的路径使用相对路径
- 在gtags进行符号匹配时忽略大小写
- 在文件保存时自动更新global索引
- 快捷键
M-t
搜索tag,M-r
搜索rtag,M-s
搜索符号
-
快捷键
M-,
跳转到上一个历史记录,M-.
跳转到下一个历史记录在MacOS使用时需要额外注意的是在emacs中不能够正常调用global, 需要借助额外的插件
exec-path-from-shell
修复可执行程序的路径问题。
参考资料: https://github.com/syohex/emacs-helm-gtags
(全文完)