Wie speichere ich ein Tastaturmakro als Lisp-Funktion?

41

Sehr häufig musste ich die Schritte ausführen, die mehrere Tastenanschläge erforderten. Für dieselbe Sitzung können diese Schritte in einem Tastaturmakro aufgezeichnet werden.

Ein Beispiel ist das Speichern eines häufig ausgeführten Such- / Ersetzungsvorgangs als Tastaturmakro. Aber dieses Makro geht verloren, wenn ich Emacs beende.

Wie kann ich mein häufig verwendetes Tastaturmakro als Lisp-Funktion speichern?

Der Einfachheit halber möchte ich die Aktion des Ersetzens von "abc" durch "def" als Funktion speichern, damit ich sie in allen Emacs-Sitzungen wiederverwenden kann.

Kaushal Modi
quelle

Antworten:

48

Hier sind die Schritte, denen Sie folgen können:

  • Wählen Sie die Region aus, in der Sie suchen und ersetzen möchten.
  • Starten Sie die Makroaufnahme.

    M-x start-kbd-macro

  • Führen Sie die erforderlichen M-x query-replace-regexpSchritte aus (ersetzen Sie "abc" durch "def") und verwenden Sie !, um das Suchen und Ersetzen in der gesamten Region zu erzwingen.
  • Stoppen Sie die Makroaufnahme.

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

  • Haben M-x kmacro-name-last-macround dem Makro einen beschreibenden Namen geben wie replace-abc-with-def. Anschließend können Sie das Makro erneut aufrufen M-x replace-abc-with-def.
  • Speichern Sie nun dieses Makro als Funktion in einer Datei, die Sie während Ihrer Emacs-Initialisierung laden. zum Beispiel init.el.
    • M-x insert-kbd-macro
    • Wählen Sie Ihr benanntes Makro aus, das dort eingefügt werden soll.

Die automatisch erstellte replace-abc-with-defFunktionsdefinition sieht folgendermaßen aus:

(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)))

Jetzt können Sie M-x replace-abc-with-defin allen Ihren Emacs-Sitzungen.

Kaushal Modi
quelle
1
+1 für insert-kbd-macro. Das ist die Antwort auf die Frage (und der Rest dieser Antwort bietet zusätzliche Hilfe).
Drew
6
Beachten Sie auch, dass Emacs zwei verschiedene Formate für Tastaturmakros generieren kann. Welches Sie erhalten, insert-kbd-macrohängt davon ab, ob Sie es mit kmacro-name-last-macro(wie in der obigen Antwort) oder benannt haben name-last-kbd-macro.
Phils
1
Beachten Sie, dass Sie bei Verwendung des name-last-kbd-macroFormats (wie von @phils oben erwähnt) eine Zeichenfolge und keine Funktion erhalten. fsetWenn Sie das einem Symbol zuweisen, können Sie das Makro mit Mx ausführen, aber nicht mit lisp ( commandp-> t, functionp-> nil) aufrufen . Merkwürdigerweise fordern sie sogar über call-interactivelynicht funktioniert (obwohl Sie können verwendet werden execute-kbd-macro, um sie auszuführen).
Pyrocrasty
24

elmacro wurde bereits von @lunaryorn erwähnt, aber als Autor dieses Pakets fand ich es schön, ein Beispiel zu liefern.

Wenn Sie ein Makro wie folgt aufnehmen:

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

Dann M-x elmacro-show-last-macro upcase-last-worderzeugt doing einen Puffer mit:

(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))
Silex
quelle
17

Mit dem elmacro- Paket können Sie das zuletzt aufgezeichnete Makro als Emacs Lisp ansehen M-x elmacro-show-last-macro.

Mondhorn
quelle
7
Jemand empfiehlt mein Paket \ o /
Silex