emacsclient开新buffer慢的可能原因?

个人习惯是在命令行用命令开编辑器。 我知道Emacs的哲学不是这样,所以就试图用emacs server(用emacs --daemon启动,无特殊配置)加emacsclient来解决。本来期待可以秒开,结果发现每次都要用近一秒。 以下是一些debug信息:

Emacs 26.3

Client会秒开,但会显示scratch或者某个已经在server里打开的文件,过个1秒才会打开给emacsclient的文件。在此期间Emacs没有卡住,可以正常执行命令。而且有趣的是,只要执行任何(不会消灭掉buffer或者client)命令,想要打开的buffer就会秒开。

启动server时提供-q,速度几乎没有变化,还是要近一秒

打开server中已经打开的文件和在一个现有client内C-x C-f都是秒开

无论server中是否有已打开的其它(不同文件的)buffer,都很慢

全tui,无gui。不过-c -t以及其它选项我都试过,没有效果

我怀疑是某些client或者打开新的frame有关的variable的问题,但Emacs的文档似乎没有集中写这些?

不清楚,我刚刚试了一下是秒开啊。

我测试的是一个 6076 行的 c 语言文件,开了 lsp,切换的时候还是秒开。 vi

莫不是你的 hook 里面有 sit-for 这样的操作?

但是那样 -q 的话应该会快才对。

(setq server-log t) 对照时间轴;从 emacs -Q 测试。另外,考虑 Emacs 版本、操作系统、运行环境(如终端)。

猜測是你的终端模拟器刷新有问题。建议和 xterm 对照一下试试。

猜測是你的终端模拟器刷新有问题。建议和 xterm 对照一下试试。

正解了。我用的终端模拟器是alacritty。相关的issue在这里。具体来说,在Emacs里有xterm-extra-capabilities这么一个variable,默认是’check,此时Emacs会向终端模拟器发送一个query,但这个query在协议上似乎有歧义(毕竟Emacs的历史相当久远),所以有些终端模拟器(比如alacritty)会忽视这个query,然后Emacs就会呆在那里等到timeout。把xterm-extra-capabilities设成nil或者按docstring设成别的什么(虽然似乎都有bug)就可以解决问题。

1 个赞