emacs 在 prog-mode 下输入几个字符就卡顿几秒钟

最近几天在用 emacs 写代码的时候,会频繁出现这种情况,就是每输入几个字符,就会卡顿几秒钟,然后再输入几个字符,又会卡顿。这个问题有点严重,这让我完全没法用 emacs 了。卡顿的录频如下,大概一次要卡 10 s,从这个视频看到,前面十来秒我对 emacs 完全失去了响应,整个程序就卡住了: emacs-problem

我试了以下几个方法:

  1. 重启 Emacs,问题仍然存在
  2. 关闭自己认为可能造成卡顿的包,例如 company,pyim,auto-save,问题仍然没有解决
  3. 查看 profier 的结果:打开了 profier-report,大概半分钟,就遇到了好几次卡顿,截图如下:

我没有看出什么特别的地方,难道是 GC 的问题?

比较奇怪的是,我在 org-mode 下面输入字符是不会卡顿的,所以认为是 prog-mode 出的问题,更具体一些,我只写 python 代码,所以也可能是 python-mode 的问题。目前我不知道还有哪些思路可以排查问题,感觉这是我用 emacs 以来遇到的又一个很棘手的问题,希望大家能给予我帮助,或者再给我一些排查的思路。

我是在 windows wsl1 中使用的 emacs, emacs 的版本是 28.0.50

建议你先把 auto-save 关闭一下试试看问题是否存在。可能别的什么包绑定了一些运算要求比较高的hook 在保存模式下。

应该不是 auto-save 的问题,我尝试关闭了的,在 org-mode 下面也是正常的。另外 emacs -Q 的话没有问题,看起来应该是配置的某个地方有问题

你的 Auto-save 开了尾行去空白了吗?我把这个关了,性能提升很大。 另外,你检查一下你的配置,有哪些包需要在保存后触发的。因为默认的Auto-save 1s间隔挺短的,如果你手速慢的话,就会保存的太频繁。可以适当调大间隔。我现在用 1.5 s

我把 auto-save 给关了也还是有这个问题,我看看是不是 prog-mode-hook 的问题,但按理说我之前用得好好的,也没改什么东西,突然就出这个问题了

找到问题了,把所有的配置一个一个注释掉来查找有问题的包,最后定位的 diff-hl,应该是我开启了 diff-hl-flydiff-mode, 把这个关掉一切就正常了。不过还是不知道之前用的时候都是正常的,怎么突然就出现了这个问题,也许是 diff-hl 的问题吧。emacs 让我心力交瘁 :frowning:

这个包确实是和 auto-save 不大兼容的,因为它更新状态的时机就是保存内容的时候。 我也想把他关了,但是看习惯了以后,没有它又不大习惯。

他这个 fly 模式有问题,现在是文件保存后会显示,如果处于修改状态,不会显示 diff。在线的模式也不是特别需要,但对性能影响过于严重了

这个官方仓库有说明,正在编辑的时显示的状态是不正确的,只有保存后才会更新状态。因为频繁更新状态的成本是挺高的。

凡是需要定时器反复刷状态,或者在各种频繁调用的hook里塞入代码的都要小心.

例如modline里显示特殊效果,而modeline是高频率刷状态的.

我长期使用emacs-git-gutter, 性能还是不错的.但是也要用(setq git-gutter:update-interval 2)来优化一下性能.

如果厌烦做此类优化,那么可以使用我的成熟配置. https://github.com/redguardtoo/emacs.d