我注意到在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有關?
我能做些什麼來提高性能嗎?
我注意到在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有關?
我能做些什麼來提高性能嗎?
是的,你是對的,它該死的很慢。
對於此特定任務,您可以使用replace-regexp
。
M-x buffer-disable-undo
M-x replace-regexp $ <ENTER> C-q TAB 0 <ENTER>
沒問題,所以遲緩是可以預期的而不是擔心? – bph
我會這麼說。我使用宏來執行它們的打盹或數百次。數十萬次,你應該尋找另一種解決方案。 –
在你的鍵盤宏我看到緩慢的兩個潛在來源:
TAB
:取決於主要模式,這可能會進行大量的工作,例如中找出要使用的縮進。由於Emacs-23,它試圖移動到下一個顯示行,所以它可能需要比以前多得多的工作(它必須考慮顯示器呈現,其中包括可變寬度字體,圖片, ...)。此外,它對於您的使用並不可靠,因爲在比顯示屏更長的一條線上,它將移動到下一條顯示線但保持在同一條邏輯線上,這樣後續的c-a
將剛剛移回到相同的起始位置行(因爲C-a
工作在邏輯線上,而不是顯示線)。當然,這一切取決於line-move-visual
和visual-line-mode
。對於TAB,我沒有一個很好的建議,因爲我不知道它是打算做(取決於主要模式),但我會用C-f
取代C-n C-a
這會快很多並且更可靠。
好的一點我可以看到C-f在這種情況下會更加靈活,但它仍然很慢!我假設oleg的C-T TAB(與TAB相反)繞過TAB鍵的任何上下文特定行爲 – bph
我對信息的閱讀表明(forward-line)
可能是C-n C-a
的更好替代品,因爲它會忽略任何視覺換行符(因此效率可能更高),並移至行首(保存C-a
)。
這個答案當然並不總是適用,但是如果主要模式恰好與所討論的宏無關,那麼提高鍵盤宏執行速度的一個好方法是將緩衝區切換爲首先模式。在某些情況下,可以顯着提高速度,因爲您可以消除主要和次要模式的開銷。
如果不可能改變主要模式,您可能仍然從禁用某些次要模式的持續時間中獲得顯着益處。
但是,根據公認的回答&評論,如果搜索和替換就足夠了,那將總是比任何宏快得多。
出於好奇,你在Emacs 23中測量過這種東西嗎?宏通過交互式機器,所以它們效率不高,重複次數很多。 – user4815162342
切線方向,請注意,如果您要重複一個宏直到文件結束,您可以提供'C-u 0'而不是檢查並指定實際行數。 – phils