我注意到键盘宏在 emacs 24 中运行非常缓慢
例如 - 我刚刚尝试运行一个宏以在 105615 行文本文件中的每一行末尾附加一个“0”
C-x ( C-e TAB 0 C-n C-a C-x )
然后
C-u 105615 C-x e
大约需要 5 分钟才能完成
我以前从来没有注意到它们运行得这么慢,想知道它是否与从 23 升级到 24 有什么关系?
我能做些什么来提高性能吗?
这个答案当然不会总是适用,但是如果主要模式恰好与所讨论的宏无关,那么提高键盘宏执行速度的一个好方法是首先将缓冲区切换到基本模式。在某些情况下可以提供显着的速度提高,因为您消除了主要和次要模式的开销。
如果无法更改主要模式,则在此期间禁用某些次要模式可能仍然会带来显着的好处。
但是,根据接受的答案和评论,如果搜索和替换就足够了,那将永远比任何宏快得多。
在您的键盘宏中,我看到了两个潜在的缓慢来源:
TAB
:根据主要模式,这可能会执行大量工作,例如找出要使用的缩进。C-n
:从 Emacs-23 开始,它试图移动到下一个显示行,因此它可能需要比以前更多的工作(它必须考虑显示渲染,以及可变宽度字体、图像等细节。 .)。此外,它对您的使用也不可靠,因为在比显示更长的行上,它C-n
会移动到下一个显示行但保持在同一逻辑行上,这样后续c-a
只会移回同一行的开头(因为C-a
适用于逻辑行,而不是显示行)。当然,这一切都取决于line-move-visual
和visual-line-mode
。对于 TAB,我没有很好的建议,因为我不知道它打算做什么(取决于主要模式),但我会用它来替换C-n C-a
它C-f
会更快、更可靠。
是的,你是对的,这该死的慢。
对于此特定任务,您可以使用replace-regexp
.
M-x buffer-disable-undo
M-x replace-regexp $ <ENTER> C-q TAB 0 <ENTER>
我对信息的阅读表明这(forward-line)
可能是一个更好的替代品,C-n C-a
因为它忽略了任何视觉换行符(因此可能更有效),并移动到行首(保存C-a
)。