はい、以前に定義したマクロをマクロ リングに追加して、 kmacro-step-edit-macro で編集できるようにする方法があります。
を使用してキーボード マクロ tata に名前を付け、 for tataname-last-kbd-macro
を実行したとします。insert-kbd-macro
例えば :
(fset 'tata
[return return ?f ?o ?o return])
後で使用するために、このマクロ定義を .emacs に保存できます。新しい emacs セッションでは、次の Lisp コードを使用して、マクロを kmacro-ring に戻すことができます。
(kmacro-push-ring (list 'tata 0 "%d"))
(kmacro-pop-ring)
その後、それを行うことができますkmacro-step-edit-macro
。
kmacro-name-last-macro
の代わりに を使用してマクロに名前を付けた場合name-last-kbd-macro
、 を呼び出すとinsert-kbd-macro
、ベクターまたは文字列の代わりにラムダ関数を使用して、マクロに別の定義が挿入されます (現在のカウンターを格納できるようにするため)。たとえば、次のようになります。
(fset 'tata
(lambda (&optional arg) "Keyboard macro." (interactive "p")
(kmacro-exec-ring-item
(quote ([return return 102 111 111 return] 0 "%d")) arg)))
この場合、kmacro-step-edit-macro
これはベクトルでも文字列でもないため、エラーが発生します。この問題を解決するには、次のことができます。
ラムダ関数を従来のベクター マクロ定義 (たとえば、上記の tata の最上位の定義など) に変換します。通常、この種の変換を行うことは常に可能です。
または、ラムダ関数マクロを呼び出すマクロを定義します。たとえば、次のようにします。(fset 'foo [?\M-x ?t ?a ?t ?a return])
その後、前述のように、この foo マクロを kmacro リングに配置できます。ただし、この場合、マクロ実行の最後にいくつかの副作用が生じる可能性があります。