输入延迟比较大的解决方案

最近在使用doom emacs的时候发现输入延迟非常大,用起来总是没有vscode 的输入顺畅(甚至让我一度想放弃emacs)。 于是我花了点时间尝试减少编码时的输入延迟,功夫不负有心人,获得了一些成果,在这里记录一下。

1. 使用emacs-lsp-booster/lsp-bridge/emacs-30+

使用emacs-lsp-booster 和 emacs-30+这两种方式都是通过优化json序列化获得性能上的提升(但是这种方式任然不够)

lsp-bridge则是直接通过将耗时的lsp计算放在了python端,效果非常显著

2. 使用tree-sitter

这种方式应该不用多说了吧,效果很好

3. 通过设置jit-lock-defer-time 推迟语法高亮时机

但是jit-lock-defer-time别设置太大,不然高亮会慢。我自己使用evil, 所以可以在进入insert state 的时候将jit-lock-defer-time设置成0.25, 退出insert state的时候设置成0

4. 开启native-comp

5. [关键] 审查pre-command-hook, post-command-hook, self-insert-hook

这一步很关键是因为大多数论坛里面的人上面的优化都做过了,但是还是可能会觉得延迟比较大(尤其是对比过vscode, sublime后)。

post-command-hook , pre-command-hook 非常容易被滥用。这两个hook是在每次执行command的时候都会跑一次, 对应的就是每type一个字符就会跑一边hook中的所有函数。因为self-insert-command 是一个command, 而emacs输入字符就是通过这个command实现的(不知道理解的对不对)。

我做了上面提到的优化后(eglot + tree-sitter + mps + native-comp),仍然觉得输入延迟非常大不满意,于是才做了这最后一步。

在做这一步的时候,我发现yasnippet, emojify, smartparens, 的影响比较大, 所以禁用了这三个包, 使用tempel替代了yasnippet。 调试的时候可以查看这三个hook中有哪些函数比较可疑,计算耗时比较大,可以考虑禁用或者优化一下

7 个赞

是否可以分享一下相关设置的代码?