emacs有什么插件可以搜索ctags产生的tags文件么?

vim的fzf插件就提供了tags搜索, emacs有能做到同样的事的插件么? 动机: 想快速搜索ctags产生的tag. 原因: org笔记的heading搜索是我一直心心念念的功能, 并且发现, 以当前规模, 如果不先保存所有文件的heading, 搜索起来是很慢的(大概十几秒), 打算用ctags生成的tags保存headings. 之前在vim就是这么干的, 并且非常好用.

1 个赞

counsel-etags 代码导航, 注意你不需要手动生成tags文件,第一次运行counsel-etags的命令会自动生成tags文件,具体细节见其README.

也可以用emacs内建的xref,速度慢一点,UI功能少一点.

company-ctags代码自动完成.

都是使用ctags生成的tags文件.

也可以用company-mode内置的company-etags速度慢很多.

3 个赞

请问counsel-etags更新tags file, 是整个project重新生成一次, 还是只对当前file更新? vim的gutentags是只更新当前文件, 这样速度就很快, 并且是异步的.

异步更新,更新整个tags.我不知道vim如何做到只更新当前代码文件,如果ctags是更新的命令行后端的话技术上不太可能. 你可以查一下它的代码实现确认一下.

如果命令行程序是gnu global的话,那么就要使用不同的插件了,你可以用gtags搜索一下对应插件.这个我没用过,所以不好推荐.印象中emacs也都支持的.

更新, 看了一下其代码, https://github.com/ludovicchabant/vim-gutentags/blob/b77b8fabcb0b052c32fe17efcc0d44f020975244/plat/unix/update_tags.sh#L144

使用了ctags的--append参数, 这样做的缺点是会生成重复数据.

这样生成的tags对于其他插件不是很友好.我不会采用这样的路线.

好的, 感谢!

README中说: Usually, ctags can only append tags to an existing tag file, so Gutentags removes the tags for the current file first, to make sure the tag file is always consistent with the source code.

它的做法好像会先删除当前文件对应的tags, 再append.

这样听上去有点道理. 不过emacs中我大概不会这样做.读写一个TAGS文件用Lisp的话会阻塞UI. 如果引入其他脚本的话开发成本太高. 本来Lisp是跨平台的,我只要在一个平台上测一下,其他平台也就工作了.

更新tags是后台命令行程序做的,不影响前端UI的搜索速度.

counsel-etags我用Linux Kernel的代码测过,速度不错.