在Emacs中使用GNU Global阅读代码

浏览: 88 发布日期: 2016-08-17 分类: emacs
作者: Jolly Wing(jiqingwu@gmail.com)
日期: 2014-05-13
声明:转载请保留作者信息

什么是GNU Global

GNU global
是一款优秀的代码阅读工具。
能对符号的定义和引用建立索引,方便代码阅读。

GNU global支持的语言很多,
它自身支持 C, C++, Yacc, Java, PHP4 和汇编语言中符号的定义和引用,
还通过 Exuberant Ctags 支持40余种语言的符号定义的索引。
能通过命令行使用,也能和Vim以及Emacs很好地集成。

安装GNU Global

对于Unix/Linux用户来说,可以直接从仓库进行安装。安装完不需要进行其它设置,很省事。

Windows用户要自己去下载。
到Gnu Global的 下载页面
可以下载代码,自己用mingw编译,也可以下载预编译的二进制文件。

因为自己编译麻烦,我直接下载了二进制包。
下载zip压缩包后,解压,将其bin目录加入Emacs路径。
具体可以这样做:

(setenv "PATH" (concat "/path/to/global/bin;" (getenv "PATH")))

然后在Emacs的shell中试一下 gtags --help,看gtags能否正常运行。

在Emacs中使用Gtags

  1. 安装 gtags.el
    gtags安装时自带了gtags.el,找到它,把它复制到emacs的 load-path 中。
    也可以用 elpa 安装 gtags.el.
    准备好 gtags.el 之后,在 .emacs 或是 .emacs.d/init.el 中加入
    (setq gtags-suggested-key-mapping t) 以使用建议的键绑定。

  2. 生成代码索引文件。
    打开在代码目录下执行 gtags,将生成索引,生成GPATH, GTAGS, GRTAGS。
    如果想看详细输出,用 gtags -v,能看到哪些文件被索引了。

  3. 在Emacs中打开一个源文件, M-x gtags-mode,如果 gtags.el 正确安装了,就会启动 gtags minor-mode。
    然后就可以使用gtags的按键绑定了。我常用的按键如下:

  • C-c v,告诉Emacs项目的根目录,即到哪里去找GTAGS等文件。这一步不要跳过,否则你查找符号时Emacs会问你去哪里查找tags。
  • M-.,跳转到符号定义。
  • C-t,返回。
  • C-c g,在代码中用grep查找符号。
  • C-c s, 搜索某个符号。
  • C-c r, 看一个函数在哪些地方被引用。

使用windows遇到的问题

在Linux/Unix上使用Emacs + global时,一般不会有什么问题。
但在Windows上会遇到些问题。

第一个问题,我按 C-c v 告诉 global 去哪查找TAGS时。Emacs报错。

gtags-get-rootpath: Searching for program: permission denied, global

这说明在执行gtags.el中的 gtags-get-rootpath 时,找不到 global 程序。

如果Emacs报错: Searching for program: permission denied, xxx
说明 xxx 不在 exec-path 中。

这里要说一下 emacs 中 "PATH" 和 exec-path 的区别。
如果你想在emacs的SHELL中调用某个程序,要把它的路径加入 "PATH" 中。
如果你想在 elisp 中调用某个程序,要把它的路径加入 exec-path.

Emacs启动时,会根据系统环境变量PATH的值初始化exec-path
如果你后面通过 setenv 向 PATH 中加入了某个路径,
exec-path并不会自动包含这个路径。

比如,刚才我们通过

(setenv "PATH" (concat "/path/to/global/bin;" (getenv "PATH")))

向PATH中加入了global的执行路径,exec-path 中并不包含该路径,所以会报错。
我们要向 exec-path 中加入该路径。

(setq exec-path (append exec-path '("/path/to/global/bin")))

把global的执行路径加入 exec-path 之后,再按 C-c v 就能正常运行了。

M-. 寻找一个 TAG 试试。又出错了。

global: directory 'e:/jollywing/job/Casparcg/Server/' not found.

其中e:/jollywing/job/Casparcg/Server/是刚才通过 C-c v 设置的项目根目录,怎么会找不到呢?

偶然发现,去掉路径最后的 / ,即根目录设为 e:/jollywing/job/Casparcg/Server 就可以了。

最后说明一下,在操蛋的windows下,才会遇到这些问题。

返回顶部