2012-10-04 74 views
3

我注意到在Emacs運行速度非常慢的鍵盤宏24Emacs的24鍵盤宏運行緩慢

例如 - 我只是試圖運行宏在105615行追加一個「0」到每一行的末尾文本文件

C-x (C-e TAB 0 C-n C-a C-x) 

然後

C-u 105615 C-x e 

大約需要5分鐘才能完成

我從來沒有注意到它們之前運行得如此之慢,想知道它是否與從23升級到24有關?

我能做些什麼來提高性能嗎?

+0

出於好奇,你在Emacs 23中測量過這種東西嗎?宏通過交互式機器,所以它們效率不高,重複次數很多。 – user4815162342

+1

切線方向,請注意,如果您要重複一個宏直到文件結束,您可以提供'C-u 0'而不是檢查並指定實際行數。 – phils

回答

4

是的,你是對的,它該死的很慢。

對於此特定任務,您可以使用replace-regexp

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

沒問題,所以遲緩是可以預期的而不是擔心? – bph

+3

我會這麼說。我使用宏來執行它們的打盹或數百次。數十萬次,你應該尋找另一種解決方案。 –

5

在你的鍵盤宏我看到緩慢的兩個潛在來源:

  • TAB:取決於主要模式,這可能會進行大量的工作,例如中找出要使用的縮進。由於Emacs-23,它試圖移動到下一個顯示行,所以它可能需要比以前多得多的工作(它必須考慮顯示器呈現,其中包括可變寬度字體,圖片, ...)。此外,它對於您的使用並不可靠,因爲在比顯示屏更長的一條線上,它將移動到下一條顯示線但保持在同一條邏輯線上,這樣後續的c-a將剛剛移回到相同的起始位置行(因爲C-a工作在邏輯線上,而不是顯示線)。當然,這一切取決於line-move-visualvisual-line-mode

對於TAB,我沒有一個很好的建議,因爲我不知道它是打算做(取決於主要模式),但我會用C-f取代C-n C-a這會快很多並且更可靠。

+0

好的一點我可以看到C-f在這種情況下會更加靈活,但它仍然很慢!我假設oleg的C-T TAB(與TAB相反)繞過TAB鍵的任何上下文特定行爲 – bph

0

我對信息的閱讀表明(forward-line)可能是C-n C-a的更好替代品,因爲它會忽略任何視覺換行符(因此效率可能更高),並移至行首(保存C-a)。

8

這個答案當然並不總是適用,但是如果主要模式恰好與所討論的宏無關,那麼提高鍵盤宏執行速度的一個好方法是將緩衝區切換爲首先模式。在某些情況下,可以顯着提高速度,因爲您可以消除主要和次要模式的開銷。

如果不可能改變主要模式,您可能仍然從禁用某些次要模式的持續時間中獲得顯着益處。

但是,根據公認的回答&評論,如果搜索和替換就足夠了,那將總是比任何宏快得多。