Comment enregistrer une macro de clavier en tant que fonction Lisp?

41

Très souvent, je devrais effectuer l'ensemble des étapes nécessitant plusieurs touches. Pour la même session, ces étapes peuvent être enregistrées dans une macro de clavier.

Un exemple consiste à enregistrer une opération de recherche / remplacement fréquemment exécutée en tant que macro de clavier. Mais cette macro est perdue quand je quitte emacs.

Comment enregistrer ma macro de clavier fréquemment utilisée en tant que fonction Lisp?

Par souci de simplicité, je souhaite sauvegarder l’action consistant à remplacer "abc" par "def" afin que je puisse le réutiliser lors de sessions emacs.

Kaushal Modi
la source

Réponses:

48

Voici les étapes que vous pouvez suivre:

  • Sélectionnez la région dans laquelle vous souhaitez effectuer la recherche-remplacement.
  • Lancer l'enregistrement de la macro.

    M-x start-kbd-macro

  • Faites le nécessaire M-x query-replace-regexp(remplacez "abc" par "def") et utilisez-le !pour forcer la recherche-remplacement dans toute la région.
  • Arrêtez l'enregistrement de la macro.

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

  • Faites M-x kmacro-name-last-macroet donnez à la macro un nom descriptif comme replace-abc-with-def. Vous pourrez alors appeler cette macro à nouveau M-x replace-abc-with-def.
  • Enregistrez maintenant cette macro en tant que fonction dans un fichier que vous avez chargé lors de l’initialisation d’emacs; par exemple init.el.
    • M-x insert-kbd-macro
    • Sélectionnez votre macro nommée pour y être insérée.

La replace-abc-with-defdéfinition de fonction créée automatiquement ressemble à ceci:

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

Vous pouvez maintenant participer M-x replace-abc-with-defà toutes vos sessions emacs.

Kaushal Modi
la source
1
+1 pour insert-kbd-macro. C'est la réponse à la question (et le reste de cette réponse fournit une aide supplémentaire).
Drew
6
Notez également qu'Emacs peut générer deux formats différents pour les macros de clavier. Lequel vous obtenez lorsque vous insert-kbd-macrodépendez de si vous l'avez nommé en utilisant kmacro-name-last-macro(comme dans la réponse ci-dessus) ou name-last-kbd-macro.
phils
1
Notez que si vous utilisez le name-last-kbd-macroformat (comme mentionné par @phils ci-dessus), vous vous retrouvez avec une chaîne, pas une fonction. fsetTransférer cela en symbole vous permet d’exécuter la macro avec Mx, mais ne l’ appelez pas depuis lisp ( commandp-> t, functionp-> nil). Étrangement, même l'appeler via call-interactivelyne fonctionne pas (bien que vous puissiez l' utiliser execute-kbd-macropour l'exécuter).
pyrocrastie
24

elmacro a déjà été mentionné par @lunaryorn, mais en tant qu'auteur de ce paquet, j'ai pensé qu'il serait bien de donner un exemple.

Si vous enregistrez une macro comme ceci:

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

Faire alors M-x elmacro-show-last-macro upcase-last-wordproduit un tampon avec:

(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
la source
17

Le paquetage elmacro vous permet d’afficher la dernière macro enregistrée avec Emacs Lisp avec M-x elmacro-show-last-macro.

lunaryorn
la source
7
Quelqu'un recommandant mon paquet \ o /
Silex