1 引言

本文主要针对emacs中的global的配置和使用方法做了简要介绍。global是代码标签化索引工具,能够在许多源码中快速定位函数的实现位置。我主要使用global来辅助代码跳转;还有一种用法是用来辅助代码补全,目前正在研究中。

2 GNU Global相关介绍

global是一个源代码标签索引系统,它的特点如下:

  • 编辑器中立
  • 能够区分代码中的“定义”和“引用”

global的内置解析器能够完成C, C++, Yacc, Java, PHP4和汇编的语法解析;也可以通过插件拓展完成很多其他语言的解析。

参考资料:https://www.gnu.org/software/global/

3 GNU Global基本用法

直接在源文件的根目录中运行gtags,就会生成索引文件。

  • GTAGS : 定义
  • GRTAGS : 引用
  • GPATH : 路径

生成索引文件后,使用global指令就可以完成代码的索引。

4 GNU Global高级用法

高级用法主要涉及对系统的头文件目录中的文件进行索引。
系统头文件目录通常来说是只读的,而且我们也不希望产生的临时文件污染系统头文件目录。可以通过修改 MAKEOBJDIRPREFIXGTAGSLIBPATH 等环境变量实现。但是目前我还没有研究出来正确的使用方法。
我目前的方法是通过创建系统头文件目录的软链接到工程目录,这样gtags在生成索引数据库时就能够扫描系统头文件目录了。

参考资料:https://www.gnu.org/software/global/globaldoc_toc.html

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)))

以上配置实现的效果:

  1. c-modec++-modeasm-mode 中开启 helm-gtags
  2. 匹配结果的路径使用相对路径
  3. 在gtags进行符号匹配时忽略大小写
  4. 在文件保存时自动更新global索引
  5. 快捷键 M-t 搜索tag, M-r 搜索rtag, M-s 搜索符号
  6. 快捷键 M-, 跳转到上一个历史记录, M-. 跳转到下一个历史记录

    在MacOS使用时需要额外注意的是在emacs中不能够正常调用global, 需要借助额外的插件 exec-path-from-shell 修复可执行程序的路径问题。

参考资料: https://github.com/syohex/emacs-helm-gtags

(全文完)