Global CTags and Emacs

| 分类 Emacs  | 标签 global  ctags  emacs 

工作交接得差不多了,这几天比较闲,又折腾了几天的 Emacs 和 Gnu Global ,解决了几个以前一直存在、但没时间折腾的问题,这里简单做个记录。

1 Global

1.1 Gnu Global & C++

之前在工作中发现 global 貌似不能正确的解析 C++ 的命名空间 (namespace) 。比如:

 1: namespace Test
 2: {
 3: class TestObject
 4: {
 5: public:
 6:     TestObject()
 7:         : m_value(0) {}
 8:     virtual ~TestObject() {}
 9:     void Show() {}
10: private:
11:     int m_value;
12: };
13: }

很简单的一个定义,但一旦将类的定义/实现放在了 namespace 里面,gtags 就解析不到这个符号。一直觉得这应该是个配置上的问题,后来终于发现,默认情况下,对 CPP & H 文件,gtags 用的 Parser 居然是 C parser:

extracting tags of test.cpp
File './test.cpp' is handled as follows:
   suffix:   |.cpp|
   language: |cpp|
   parser:   |C|
   library:  |built-in|

折腾了多次 global 的配置后,终于解决了这个问题,配置文件参见:Global 配置文件

1.2 Global, Ctags & pygments

global 本身支持多种语言的 TAG 的交叉查找,包括 c/c++, java, elisp, php 等等,此外还可以通过插件来支持其他的语言。

1.2.1 ctags

Global 可以通过 ctags 来解析其他的语言,安装方法参考:https://github.com/leoliu/ggtags

Compile and install Global with exuberant-ctags

./configure –prefix=<PREFIX> –with-exuberant-ctags=/usr/local/bin/ctags

make && make install

The executable ctags is unfortunately named because emacs also includes a command of the same name. So make sure it is from http://ctags.sourceforge.net. See plugin-factory/README in GNU Global source for further information.

1.2.2 Pygments

新版 (6.4) 的 Global 内置了 pygments,用于从 python 文件中提取标签。 https://github.com/leoliu/ggtags 上给出了 pygments 的手动安装方法:

The pygments plugin has been included in global since version 6.3.2. pip install pygments is the only step required. Note the plugin is not activated by the default gtags.conf or .globalrc. See global/plugin-factory/PLUGIN_HOWTO.pygments for details.

The following instructions are for older global.

pip install pygments

git clone https://github.com/yoshizow/global-pygments-plugin.git

cd global-pygments-plugin/

sh reconf.sh

./configure –prefix=<PREFIX> –with-exuberant-ctags=/usr/local/bin/ctags

make && make install

cp sample.globalrc $HOME/.globalrc

Make sure the value of <PREFIX> agree with step 1.

1.2.3 My gentoo overlay

这里 有一个 global 的 ebuild,已经添加了 ctags 和 pygments 的支持,Gentoo 和 Prefix 的用可以拿它来安装 global.

1.3 Global 配置文件

前面提到的 C++ 解析和 Ctags, pygments 都需要相应的配置文件。可惜的是,global 的配置文件文档不全,磕磕绊绊折腾了比较长的时间才弄好一份: https://github.com/yangyingchao/tubo-env/blob/master/.globalrc_rc

2 Global & Emacs

关于 global 和 Emacs 的整合,网络上已经有很多的教程和插件了,比如:

自从从 cscope 转到 global 之后, 我之前一直在用 xgtags ,用的很习惯。但前几天开始接触 helm 之后,逐渐的习惯和喜欢上了 Helm 的这个交互式的操作,所以尝试了一段时间 helm-gtags,但习惯了 xgtags 的操作和界面,用 helm-gtags 总是感觉不习惯,而且 helm-gtags 里面加了很多个人感觉莫名其妙或者没什么大用的东西。所以花了几天时间把原来的 xgtags 做了修改。

修改后的 xgtags 和原来相比:

  • 增加了通过 helm 来实现 Tag/file 的过滤
  • xgtags-select-mode 下可以触发 helm-xgtags--activate
  • xgtags-parse-file 下高亮并 preselect 当前函数。

修改后的 xgtags 与 helm-ggtags 相比:

  • 有更好的高亮显示
  • 可以通过 xgtags-select-next-tag / xgtags-select-prev-tag 直接选择之前或之后的tag
  • xgtags-parse-file 下高亮并 preselect 当前函数。

感兴趣的 Emacser 可以从 这里 找到源码。


上一篇     下一篇