Jak zapisać makro klawiatury jako funkcję Lisp?

41

Bardzo często musiałbym wykonać zestaw kroków wymagających wielu naciśnięć klawiszy. W tej samej sesji kroki te można zapisać w makrze klawiatury.

Przykładem jest zapisanie często wykonywanej operacji wyszukiwania / zamiany jako makra klawiatury. Ale to makro jest tracone, kiedy wychodzę z emacsa.

Jak zapisać często używane makro klawiatury jako funkcję Lisp?

Dla uproszczenia chcę zapisać akcję zastępowania „abc” przez „def” jako funkcję, aby móc ponownie używać go w sesjach emacs.

Kaushal Modi
źródło

Odpowiedzi:

48

Oto kroki, które możesz wykonać:

  • Wybierz region, w którym chcesz wykonać zamianę wyszukiwania.
  • Rozpocznij rejestrowanie makra.

    M-x start-kbd-macro

  • Wykonaj wymagane czynności M-x query-replace-regexp(zamień „abc” na „def”) i użyj, !aby wymusić wyszukiwanie-zamień w całym regionie.
  • Zatrzymaj rejestrowanie makra.

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

  • Zrób M-x kmacro-name-last-macroi nadaj makrze opisową nazwę jak replace-abc-with-def. W ten sposób będziesz mógł ponownie wywołać to makro, robiąc to M-x replace-abc-with-def.
  • Teraz zapisz to makro jako funkcję do pliku, który ładujesz podczas inicjacji emacsa; na przykład init.el.
    • M-x insert-kbd-macro
    • Wybierz nazwane makro, które chcesz tam wstawić.

Automatycznie utworzona replace-abc-with-defdefinicja funkcji wygląda następująco:

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

Teraz możesz M-x replace-abc-with-defwe wszystkich swoich sesjach emacs.

Kaushal Modi
źródło
1
+1 dla insert-kbd-macro. To jest odpowiedź na pytanie (a reszta tej odpowiedzi zapewnia dodatkową pomoc).
Drew
6
Zauważ też, że Emacs może generować dwa różne formaty makr klawiatury. Który otrzymujesz, kiedy insert-kbd-macrozależy od tego, czy nazwałeś go używając kmacro-name-last-macro(jak w powyższej odpowiedzi) lub name-last-kbd-macro.
phils
1
Zauważ, że jeśli użyjesz name-last-kbd-macroformatu (jak wspomniano powyżej przez @phils), otrzymasz ciąg, a nie funkcję. fsetprzypisanie tego do symbolu pozwala wykonać makro za pomocą Mx, ale nie wywoływać go z lisp ( commandp-> t, functionp-> nil). O dziwo, nawet nazywając ją poprzez call-interactivelynie działa (choć można użyć execute-kbd-macro, aby go uruchomić).
pirokrazja
24

Elmacro był już wspomniany przez @lunaryorn, ale jako autor tego pakietu pomyślałem, że dobrze byłoby podać przykład.

Jeśli zarejestrujesz takie makro:

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

Następnie zrobienie M-x elmacro-show-last-macro upcase-last-wordtworzy bufor z:

(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
źródło
17

Elmacro pakiet pozwala zobaczyć ostatni nagrany makro jako właściwego Emacs Lisp z M-x elmacro-show-last-macro.

księżycowy
źródło
7
Ktoś polecający mój pakiet \ o /
Silex