Come salvare una macro di tastiera come funzione Lisp?


41

Molto spesso avrei bisogno di eseguire la serie di passaggi che richiedono più tasti. Per la stessa sessione, questi passaggi possono essere registrati in una macro di tastiera.

Un esempio è il salvataggio di un'operazione di ricerca / sostituzione eseguita frequentemente come macro della tastiera. Ma quella macro si perde quando esco da emacs.

Come posso salvare la macro della tastiera usata di frequente come funzione Lisp?

Per semplicità, voglio salvare l'azione di sostituzione di "abc" con "def" come funzione in modo da poterlo riutilizzare nelle sessioni di emacs.

Risposte:


48

Ecco i passaggi che puoi seguire:

  • Seleziona la regione in cui desideri effettuare la ricerca-sostituzione.
  • Inizia a registrare macro.

    M-x start-kbd-macro

  • Fai il necessario M-x query-replace-regexp(sostituisci "abc" con "def") e usa !per forzare la sostituzione della ricerca in tutta la regione.
  • Ferma la registrazione della macro.

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

  • Fai M-x kmacro-name-last-macroe dai alla macro un nome descrittivo come replace-abc-with-def. Sarai quindi in grado di richiamare nuovamente quella macro facendo M-x replace-abc-with-def.
  • Ora salva questa macro come funzione in un file che carichi durante l'inizializzazione di emacs; per esempio init.el,.
    • M-x insert-kbd-macro
    • Seleziona la tua macro con nome da inserire lì.

La replace-abc-with-defdefinizione della funzione creata automaticamente si presenta così:

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

Ora puoi farlo M-x replace-abc-with-defin tutte le sessioni di emacs.


1
+1 per insert-kbd-macro. Questa è la risposta alla domanda (e il resto di questa risposta fornisce ulteriore aiuto).
Drew

6
Si noti inoltre che Emacs può generare due diversi formati per le macro della tastiera. Quale ottieni quando insert-kbd-macrodipendi dal fatto che lo hai chiamato usando kmacro-name-last-macro(come nella risposta sopra) o name-last-kbd-macro.
phils,

1
Nota che se usi il name-last-kbd-macroformato (come menzionato sopra @phils) finisci con una stringa, non una funzione. fsetassegnandolo a un simbolo è possibile eseguire la macro utilizzando Mx, ma non chiamarla da lisp ( commandp-> t, functionp-> nil). Stranamente, anche chiamarlo via call-interactivelynon funziona (anche se puoi usarlo execute-kbd-macroper eseguirlo).
pirofastia

24

elmacro è già stato citato da @lunaryorn, ma come autore di questo pacchetto ho pensato che sarebbe stato bello fornire un esempio.

Se registri una macro come questa:

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

Quindi facendo M-x elmacro-show-last-macro upcase-last-wordproduce un buffer con:

(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

Il pacchetto elmacro consente di visualizzare l'ultima macro registrata come corretta Emacs Lisp con M-x elmacro-show-last-macro.


7
Qualcuno che consiglia il mio pacchetto \ o /
Silex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.