Emacs 30.1 增加了一个新的 global minor mode `etags-regen-mode`

** New global minor mode ‘etags-regen-mode’.
This minor mode generates the tags table automatically based on the
current project configuration, and later updates it as you edit the
files and save the changes.

以前在 Emacs 里使用 etags 非常麻烦:

  • 需要自己封装 etags 命令生成 TAGS
  • 需要为不同的项目,维护扩展名列表,包括 ignore list
  • 代码修改后,需要手动刷新 TAGS
  • 或引入第三方库,比如: ggtags

Emacs 30.1 增加了一个新的 minor mode,支持开箱即用。

使用方法:

  • init.el
    (setq etags-regen-program "etags") ;你的 etags 可执行程序路径
    (require 'etags-regen)
    
  • 配置项目 .dir-locals.el
    • 比如:((c-mode . ((etags-regen-file-extensions . ("h" "c")))))
  • 启用 etags-regen-mode
  • xref-find-definitions 时,会自动生成 TAGS
  • save-buffer 时,会自动更新 TAGS

经测试,etags-regen-mode 兼容 Emacs 29.3,只要把 etags-regen-mode.el 拷贝到 load-path.

3 个赞

save-buffer时,自动更新TAGS, 我原来也这样设置, 后来感觉更新较频繁无必要, 于是改成了, 代码在编译(解释)执行时触发一次TAGS更新.

ETAGS 相比 eglot+clangd 有啥优势嘛?

etags 只有 symbol 相关支持,如 main 函数、全局变量名、宏名。如果只用 C++/C,那 etags 只在扫描不频繁时有显著的性能优势,因为 tags 文件非常好分析。如果跨语言,比如 php + C,那 etags 可以同时补全所有语言,并且,比如某 C 源代码字符串字面量中是 php 函数名,通过字符串跳转也可以跳转到目标 php 函数去。我知道 php 已经不先进了,唯以此举例。

2 个赞