gtags vs etags

看到 @zilongshanren 的配置里对一些语言禁用掉了默认的 gtags,自己用 etags-select 写了相关的配置。etags 和 gtags 有什么不一样吗?@zilongshanren 为什么做了这样的取舍?

这个帖子我看过。感觉上时 gtags 优于 etags。其实我想问的是为什么 @zilongshanren 不用默认的 gtags,而自己花功夫配置。仅仅是因为个人的使用习惯吗?

1 个赞

这要问本人了。可能是因为 gtags 的太多功能他感觉用不着吧。etags 是自带的,不用白不用。

是指 https://github.com/zilongshanren/spacemacs-private/blob/6a8212a3be2b54b3df2050a5886595bdbf76e5f7/init.el#L61 吗?我猜可能是基于 gtags/etags 的配置方便(或跟其它包的配合)程度的考虑。在子龙的 commit 里面写道:

  • May 5, 2016
helm ctags is very slow and etags-select rocks!
  • Feb 22, 2016
Tips: don't use large ctags file and company-etags together.
Gtags performance is good.. but don't know how to config.

其实我很久没用 tags 了,什么 gtags(GNU Global), ctags(universal-ctags, exuberant-ctags), etags, cscope…光是它们之间的关系要理清楚就不太容易了。

具体到 gtags/ctags 在某个特定的模式下有什么优劣,更是不了解。以下是粗略(不完全+不准正确)的比较:

  • etags 是 Emacs 自带的,可能支持度会比较好;gtags 需要额外安装。

  • etags 支持 28 种语言(etags --help);gtags 默认支持 6 种语言,通过 Pygments(或 universal-ctags) 扩展之后支持 25 (或更多)种语言。

  • etags 只包含定义(definition);gtags 包含定义(definition)和引用(reference)。

  • etags 的 TAG 文件是文本;gtags 的 TAG 文件是二进制,查找速度可能会快。但是 gtags 也能兼容 ctags(把 ctags 作为 parser),不过这样以来也就丢失了上面提到的 reference。

    • etags

      ⋊> cat TAGS
      main.c,95
      #define MIN(4,40
      int main(71,1855
      
    • ctags

      ⋊> cat TAGS
      MIN     main.c  /^#define MIN(a, b) (a < b) ? a : b$/
      Mmain   main.c  /^int main(int argc, char *argv[])$/
      
    • gtags

      ⋊> file GTAGS
      GTAGS: Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)
      

参考:

3 个赞

我也是刚上手 tag 跳转,比较疑惑好像 spacemacs 的 gtags layer 已经有了完善的快捷键绑,但是 @zilongshanren 却禁用了它,并自己配置了一套。

费心查找这么多资料,谢谢 @twlz0ne 。 学到了一个新技巧,搜索 git comit 记录,揣摩作者的意图,谢谢 @twlzOne

同意。etags的功能是在是不敢恭维,有点老,而且对各种语言支持也不是很好。gtags用的话,如果愿意用etags,那生成tags时选etags就行了嘛,干嘛非得配两套tag系统(rtags针对C++除非,这是另外的事儿)。我用helm-gtags.

哦,对了,我没用spacemacs,是原生的。

刚开始我是同时使用了 gtags和etags,后来,我为了简单(减少packages的数量),我就把 gtags去掉了,只保留了etags。 其实没有什么特别的原因,主要是etags基本满足我的要求。

PS: 不是说一个包比另一个包更牛比,就一定要用牛比的东西。有时候,刚好满足需求即可。

同意, 牛逼的包往往需要更多的经历来学习。。。。

多谢分享,ctags的子孙太多了,有点分不清楚了。

可以用 ctags 来生成 etags 格式的 TAGS 文件,而 ctags 本身支持的语言也是非常多的。这样设置之后,只需要安装 ctags 就行。

1 个赞

etags我的插件counsel-etags和company-ctags已不支持了。用ctags就可以了。推荐universal-ctags