我注意到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-f
取代C-n C-a
,这将更快、更可靠。
是的,你是对的,它非常慢。
对于此特定任务,您可以使用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
)。