作者: Jolly Wing([email protected])
日期: 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
安装
gtags.el
。
gtags安装时自带了gtags.el,找到它,把它复制到emacs的load-path
中。
也可以用 elpa 安装 gtags.el.
准备好gtags.el
之后,在 .emacs 或是 .emacs.d/init.el 中加入(setq gtags-suggested-key-mapping t)
以使用建议的键绑定。生成代码索引文件。
打开在代码目录下执行gtags
,将生成索引,生成GPATH, GTAGS, GRTAGS。
如果想看详细输出,用gtags -v
,能看到哪些文件被索引了。在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下,才会遇到这些问题。