3

kmacro-name-last-macroキーボード マクロを保存するなどの kmacro コマンドを使用しています。問題は、マクロを保存して .emacs ファイルに追加した後でもエラーが発生し、 を使用してマクロを編集したいことですkmacro-step-edit-macro。名前付きマクロがマクロ リング (デフォルトkmacro-ring-maxは 8) に含まれていない場合、そのマクロに対して編集またはマクロ リング コマンドを使用できません。name-last-kbd-macro編集しやすいシンボルフォームを保存することを知った後、使用したことを後悔しkmacro-name-last-macro、なぜそれが新しいデフォルトなのか疑問に思います。

で編集できるように、以前に定義したマクロをマクロリングに追加する方法はありkmacro-step-edit-macroますか?

4

1 に答える 1

3

はい、以前に定義したマクロをマクロ リングに追加して、 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 リングに配置できます。ただし、この場合、マクロ実行の最後にいくつかの副作用が生じる可能性があります。

于 2010-09-04T12:19:58.227 に答える