Emacs 24键盘宏运行缓慢

6
我注意到在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有关?

有什么可以提高性能的方法吗?


出于好奇,你在Emacs 23中测量过这种类型的事情吗?宏会经过交互机制,所以在处理大量重复计数时效率不高。 - user4815162342
1
顺便提一下,如果您想要重复执行宏直到文件末尾,可以使用C-u 0而不是检查和指定实际行数。 - phils
4个回答

10

这个答案并不总是适用,但如果主模式对于所涉及的宏无关紧要,那么提高键盘宏的执行速度的好方法是先将缓冲区切换到 fundamental-mode。在某些情况下,这可以显著提高速度,因为您可以消除主模式和次模式的开销。

如果不能更改主模式,则您仍然可以在此期间禁用某些次模式,这可能会带来显着的好处。

但是,根据已接受的答案和评论,如果搜索和替换就足够了,那么这总是比任何宏快得多。


5
在你的键盘宏中,我看到了两个潜在的缓慢来源:
- TAB: 根据主要模式不同,这可能需要执行大量的工作,例如确定要使用的缩进。 - C-n: 自 Emacs-23 以来,它会尝试移动到下一个显示行,因此它可能比以前需要更多的工作量(它必须考虑显示渲染,包括可变宽度字体、图像等细节)。此外,在一行长度超过显示屏的情况下,C-n 将移动到下一个显示行但仍停留在同一逻辑行上,因此随后的 c-a 只会将光标移回同一行的开头(因为 C-a 是按逻辑行工作的,而不是按显示行)。当然,所有这些都取决于 line-move-visual 和 visual-line-mode。
对于 TAB,我没有好的建议,因为我不知道它的预期操作(取决于主要模式),但我会用 C-f 替换 C-n C-a,因为 C-f 会更快,也更可靠。

好的观点,我可以看到在这种情况下使用C-f会更加简洁,但它仍然非常慢!我假设Oleg的C-q TAB(而不仅仅是TAB)绕过了TAB键的任何上下文特定行为。 - bph

4

是的,你说得对,它非常缓慢。

对于这个特定的任务,您可以使用replace-regexp

M-x buffer-disable-undo
M-x replace-regexp $ <ENTER> C-q TAB 0 <ENTER>

3
我会这么说。我使用宏来执行它们十几次或数百次。如果需要执行数百万次,你应该寻找另一个解决方案。 - Oleg Pavliv

0

我的阅读资料表明,(forward-line) 可能是 C-n C-a 更好的替代品,因为它忽略了任何视觉换行符(因此可能更有效),并移动到行的开头(节省了 C-a)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接