キーボードマクロをLisp関数として保存する方法は?


41

非常に頻繁に、複数のキーストロークを必要とする一連の手順を実行する必要があります。同じセッションの場合、これらのステップはキーボードマクロに記録できます。

例として、頻繁に実行される検索/置換操作をキーボードマクロとして保存します。しかし、emacsを終了すると、そのマクロは失われます。

頻繁に使用するキーボードマクロをLisp関数として保存するにはどうすればよいですか?

簡単にするために、関数として「abc」を「def」に置き換えるアクションを保存して、emacsセッション全体で再利用できるようにします。

回答:


48

以下の手順を実行できます。

  • 検索置換を行う地域を選択します。
  • マクロの記録を開始します。

    M-x start-kbd-macro

  • 必要なことを行いM-x query-replace-regexp(「abc」を「def」に!置き換え)、を使用して、リージョン全体で検索置換を強制します。
  • マクロの記録を停止します。

    M-x kmacro-end-or-call-macro

  • 実行しM-x kmacro-name-last-macro、マクロにのようなわかりやすい名前を付けreplace-abc-with-defます。そうすると、そのマクロを再度呼び出すことができM-x replace-abc-with-defます。
  • 次に、このマクロを関数として、emacsの初期化中にロードするファイルに保存します。例えば、init.el
    • M-x insert-kbd-macro
    • そこに挿入する名前付きマクロを選択します。

自動作成されたreplace-abc-with-def関数定義は次のようになります。

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

これM-x replace-abc-with-defで、すべてのemacsセッションで使用できます。


1
+1 insert-kbd-macro。それが質問に対する答えです(そしてこの答えの残りは追加のヘルプを提供します)。
ドリュー

6
Emacsはキーボードマクロ用に2つの異なるフォーマットを生成できることにも注意してください。どちらを取得insert-kbd-macroするかkmacro-name-last-macroは、(上記の回答のように)を使用して命名したか、それともを使用して命名したかによって異なりますname-last-kbd-macro
フィル14年

1
name-last-kbd-macro(上記の@philsで述べた)形式を使用すると、関数ではなく文字列になることに注意してください。fsetこれをシンボルに指定すると、Mxを使用してマクロを実行できますが、lispから呼び出すことはできませんcommandp-> tfunctionp-> nil)。奇妙なことに、それを経由call-interactivelyして呼び出しても動作しません(ただし、実行に使用できますexecute-kbd-macro)。
火砕物

24

elmacro@lunaryornによってすでに言及されていますが、このパッケージの作成者として、例を提供するのが良いと思いました。

このようなマクロを記録する場合:

F3 C-e M-b M-u C-a C-n F4

次に、以下を実行M-x elmacro-show-last-macro upcase-last-wordしてバッファーを生成します。

(defun upcase-last-word ()
  "Change me!"
  (interactive)
  (move-end-of-line 1)
  (backward-word 1)
  (upcase-word 1)
  (move-beginning-of-line 1)
  (next-line 1 1))

17

elmacroパッケージには、との適切なEmacs Lispにと最後に記録したマクロを表示することができますM-x elmacro-show-last-macro


7
私のパッケージを推奨している誰か\ o /
Silex 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.