我注意到键盘宏在 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
)。
即使在基本模式下,我想运行的一些宏也非常慢(不可用)。我发现在终端中快速启动
emacs -nw -q
打开我的文件并运行我的宏非常快!
这不是一个正确的解决方案,但对于那些偶尔需要多次执行宏并且不想花时间找出导致特定宏执行设置缓慢的人来说可能是一个有用的解决方法.