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.
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:
+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:
insert-kbd-macro
. To jest odpowiedź na pytanie (a reszta tej odpowiedzi zapewnia dodatkową pomoc).insert-kbd-macro
zależy od tego, czy nazwałeś go używająckmacro-name-last-macro
(jak w powyższej odpowiedzi) lubname-last-kbd-macro
.name-last-kbd-macro
formatu (jak wspomniano powyżej przez @phils), otrzymasz ciąg, a nie funkcję.fset
przypisanie 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ą poprzezcall-interactively
nie działa (choć można użyćexecute-kbd-macro
, aby go uruchomić).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:
źródło
Elmacro pakiet pozwala zobaczyć ostatni nagrany makro jako właściwego Emacs Lisp z M-x elmacro-show-last-macro.
źródło