你是如何在大型C语言项目中使用Emacs的?

我在window下大型项目(2万文件300万行+)中使用Emacs感觉相对卡顿;

使用了Gtags和counsel-etags浏览代码,company用作补全(由于网络问题,只能使用github资源);

在查找符号、定义以及写新的代码时,感觉卡顿严重,基本不能正常使用;

我想优化它 ,但是感觉没有什么头绪(基本试用过搜索到的方法,但没有什么改善)

我想知道各位是如何在体量相近或更大的C项目中使用Emacs的,你们是如何搭配插件的呢, 优化时要特别注意的什么地方呢?

2 个赞

counsel-etags没有什么问题。我用Linux Kernel测过的。问题在于company-etags的代码未对大项目优化。我在 https://github.com/company-mode/company-mode/pull/877 指出了这个问题并给出了一个workaround。不能算治标,可以缓解症状。

但是负责维护的俄国人不肯接受。

不过不要紧,我又想出了一个治本的方法,用了新的算法。俄国人的态度是可以考虑。我周末可以提交代码。

如果你用的是company-gtags自动完成,那么可能是另外的原因(本质我猜都是一样的就是lisp太慢)。提交issue到company,cc我。

3 个赞

嗯,谢谢;

不过昨天我搞混了,我实际使用的方案应该是counsel-gtags + company-gtags

我profile看了一下,然后把company-idle-delay和company-tooltip-idle-delay两项值改大了,卡顿的情况有所改善;

我想问问counsel-etags + ctags + company-etags 这个搭配相比之下优缺点在哪呢?

gtags对C++/java分析的更精确,有自己的数据库,重新扫描代码并更新数据库速度快。

ctags就是用regular expression扫描代码(也许C有不同),没有数据库,所以重新扫描代码和第一遍扫描代码没更快。因为简单,所以支持更多的语言。当然不要指望regular expression能更精确。

我一般用ctags,因为我做web开发,没有写java或者c++的需要。但是有支持多种语法css/html/javascript的需要。

5 个赞

这位同学用 Emacs 写了28年 C++ , 总计180万行代码,用来求解微分方程组。 我自己用他写的 exuberant ctags 脚本生成标签后,主要用来看他的代码。

3 个赞

在emacs里调用global -xGqT,发现前后花了0.4秒,这应该是导致卡顿的主要原因

0.4秒很快了。估计还是Lisp代码的问题。更新tags file通常是独立进程,对用户体验没有影响的。Lisp本来就很慢,company代码写得也不好。另外更新tags file应还用了-u选项,所以比0.4秒更快。

我重新看了一遍你的PR,你的意思是说,因为每一次补全时都会重新构建一个lisp列表,这个过程很慢,而导致了卡顿吗?

Yes, Lisp本来就很慢。当初实现的程序员又用了一个最慢的api (该api是用lisp实现的)。我这里谈的是company-etagscompany-gtags我不清楚,不过我猜也没怎么优化过。

我把company-gtags代码看了一下,确实性能上还有很多可改进的余地。

我对company-etags的优化,

启动时间从两分钟降到9秒。查询速度是原来的50倍。根据tags file更新缓存原来也和启动时间差不多,现在1秒搞定。

在Linux Kernel的代码测试过,毫无延迟。

3 个赞

感谢,明天去看代码然后测试一下;

目前pull request 还没被接受。最简单的启用最新代码的方法: cp company-etags.el /home/cb/.emacs.d/elpa/company-20190430.1852/ && rm /home/cb/.emacs.d/elpa/company-20190430.1852/*.elc

等这个pull request 被接受后,我研究一下company-gtags的优化

2 个赞

哇, 近距离膜拜大神

直接从你fork的项目里把company-etags弄了下来;总而言之效果好得飞起;初始加载变得更快,delay设置为.1也丝毫没有卡顿;

我打算使用counsel-etags来做补全,因为这个速度飞快;

而依然选择用counsel-gtags做代码导航,因为没有find, grep 及类似的工具,试用counsel-etags觉得功能似乎不如counsel-gtags强大;

没人在 Windows 下折腾lsp+ccls 之类的开发 C/C++吗?理论上速度会比 Linux 上慢些,但比一般的基于 tag 的应该要好些。另外,搜索代码肯定用 ripgrep 了,Windows 下速度也很快,基于 rg 的跳转工具 dump-jump 也很好用啊。

company-gtags也可以基于同样的算法改进的。实际上比company-etags还容易点。

counsel-etags唯一强制依赖是ctags其他都是可选的.ctags的精确度肯定不如gtags。

为什么z而不是Z? (and (>= c ?A) (<= c ?z))

笔误,改了。谢谢。

试了下,现在是不是还不能在远程使用

不能,如果我修正了会在issue tracker里反映的。