【问题标题】:Emacs 24 Keyboard Macros Running SlowEmacs 24 键盘宏运行缓慢
【发布时间】:2012-10-04 10:28:27
【问题描述】:

我注意到键盘宏在 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 中测量过这种东西吗?宏通过交互式机制,因此它们在大量重复时效率不高。
  • 切线,注意如果你想重复一个宏直到文件结束,你可以提供C-u 0而不是检查和指定实际的行数。

标签: emacs emacs23 emacs24


【解决方案1】:

这个答案当然不会总是适用,但是如果主模式恰好与所讨论的宏无关,那么提高键盘宏执行速度的一个好方法是将缓冲区切换到 首先是基本模式。在某些情况下可以显着提高速度,因为您消除了主要和次要模式的开销。

如果无法更改主要模式,在此期间禁用某些次要模式可能仍然会给您带来显着的好处。

但是,根据公认的答案和 cmets,如果搜索和替换就足够了,那将永远比任何宏快得多。

【讨论】:

    【解决方案2】:

    在您的键盘宏中,我看到了两个潜在的缓慢来源:

    • TAB:根据主要模式,这可能会执行很多工作,例如找出要使用的缩进。
    • C-n:从 Emacs-23 开始,它试图移动到下一个显示行,因此它可能需要比以前更多的工作(它必须考虑显示渲染,以及可变宽度字体、图像等细节, ...)。此外,它对您的使用也不可靠,因为在比显示更长的行上,它C-n 将移动到下一个显示行但保持在同一逻辑行上,这样后续的c-a 只会移回同一行的开头(因为 C-a 适用于逻辑行,而不是显示行)。当然,这一切都取决于line-move-visualvisual-line-mode

    对于 TAB,我没有很好的建议,因为我不知道它打算做什么(取决于主要模式),但我会将 C-n C-a 替换为 C-f,这将是很多更快、更可靠。

    【讨论】:

    • 好点我可以看到 C-f 在这种情况下会更简洁,但它仍然非常慢!我假设 oleg 的 C-q TAB(而不仅仅是 TAB)绕过 TAB 键的任何上下文特定行为
    【解决方案3】:

    是的,你是对的,这该死的慢。

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

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

    【讨论】:

    • 我会这么说。我使用宏来执行它们打瞌睡或数百次。数十万次你应该寻找另一种解决方案。
    【解决方案4】:

    我对信息的阅读表明(forward-line) 可能是C-n C-a 的更好替代品,因为这会忽略任何视觉换行符(因此可能更有效),并移动到行首(保存C-a )。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多