Comment puis-je exécuter une macro de clavier dans des tampons sélectionnés à partir d'Ibuffer ou des fichiers sélectionnés à partir de dired?


8

Si je dois refaire le nom d'une variable, j'utilise ag et plusieurs curseurs .

Mais quand je dois supprimer / ajouter / déplacer des blocs de code, j'utilise des macros de clavier. Mais je dois basculer vers chaque tampon et lancer manuellement l'exécution de cette macro.

Existe-t-il un moyen de simplement sélectionner les tampons ouverts d'Ibuffer (ou les fichiers de dired) et d'exécuter la dernière macro de clavier enregistrée sur chacun d'eux?

Réponses:


8

Modifier les tampons Ibuffer sélectionnés

Après avoir enregistré la macro du clavier, passez à Ibuffer et,

  • Marquez les tampons souhaités en utilisant m
  • Hit W- Eval lors de l'affichage du tampon (L'eval simple Ene fonctionne PAS pour les appels de macro)
  • (kmacro-end-or-call-macro 1)

3

Vous incluez simplement la commutation de tampon dans la macro. Vous n'êtes pas limité à un seul tampon - une macro de clavier peut faire tout ce que vous pouvez faire!

J'ai répondu à peu près à cette même question l'autre jour sur SO, alors référez-vous à la macro de clavier cross-file emacs .


Je veux exécuter la macro uniquement dans quelques tampons sélectionnés de tous les tampons ouverts.
Kaushal Modi

Marquez donc les fichiers sur lesquels vous souhaitez l'exécuter et filtrez la liste uniquement sur ces fichiers. Dans dired et ibuffer, vous pouvez utiliser tpour basculer les marques et ksupprimer les entrées marquées. Un grafraîchissement ultérieur restaurera les lignes supprimées.
phils

1
Je peux simplement utiliser M-{et M-}pour passer aux éléments marqués suivants et précédents dans Ibuffer et dired.
Kaushal Modi

Ah, encore mieux!
phils

1

Voici une commande qui rend l'exécution de commandes, de macros et l'évaluation d'expressions Lisp dans plusieurs fichiers une évidence. Notez que l'argument préfixe permet d'exécuter une macro pour chaque fichier jusqu'à ce qu'une erreur se produise. J'ai déjà posté cela sur superutilisateur mais cela fonctionne si bien que je pensais que les personnes venant sur cette page pourraient également le trouver utile. J'aime lier cela à «E» en dired.

Mise à jour: l'ancienne version de cette fonction ne supportait que les macros. La mise à jour est à la fois plus simple et plus puissante, permettant d'exécuter des commandes arbitraires (par séquence de clés ou nom) ainsi que des expressions Lisp. Il est maintenant également prudent de consigner toutes les erreurs dans le tampon des messages .

;; Inspired by M-x edit-kbd-macro and https://superuser.com/q/176627.
(defun my-dired-do-execute (keys &optional arg)
  "Execute a command in all marked files.
If an error occurs, execution in other files is not affected.
(Notably, this allows to run keyboard macros until there is an error.)

At the prompt, type any bound key sequence, or `\\[execute-extended-command]'
to choose a command by its name, or `\\[eval-expression]' to enter a Lisp expression.

The prefix ARG, if given, is passed on to the chosen command.
"
  (interactive
   (list (read-key-sequence (substitute-command-keys "Key sequence to execute, \
or \\[eval-expression], or \\[execute-extended-command]: "))
         current-prefix-arg))
  (when keys
    (let ((cmd (if (arrayp keys) (key-binding keys) keys))
          exp)
      (cond ((eq cmd 'execute-extended-command)
             (setq cmd (read-command "Name of command to execute: "))
             (if (string-equal cmd "")
                 (error "No command name given")))
            ((eq cmd 'eval-expression)
             (setq exp (read--expression "Eval in selected files: "))
             (setq cmd nil))
            ((null cmd)
             (error "Key sequence %s is not defined" (key-description keys))))
      (mapc (lambda (filename)
              (save-selected-window
                (find-file-other-window filename)
                (setq current-prefix-arg arg)
                (condition-case-unless-debug err
                    (if cmd
                        (call-interactively cmd)
                      (message "Result in file %s:" filename)
                      (eval-expression exp))
                  (error (message "In file %s: %S" filename err)))))
            (dired-get-marked-files)))))

0

Modification des fichiers sélectionnés dans dired

La solution ci-dessous nécessite l'installation du dired+package, qui est disponible sur Melpa.

  1. Tout d'abord, convertissez votre macro de clavier en fonction elisp. Voici une emacs.SE QnA connexe (Comment enregistrer une macro clavier en tant que fonction Lisp?).

    C'est encore plus rapide si vous savez comment modifier directement tous les fichiers à l'aide d'une fonction elisp. Supposons que vous souhaitiez ajouter "- * - mode: org - * -" au début de tous les fichiers sélectionnés en dired. 1

    Dans ce cas, l'exécution de la fonction elisp ci-dessous dans chacun des fichiers sélectionnés fonctionnerait.

    (defun my/set-org-mode ()
      (goto-char (point-min))
      (insert "-*- mode: org -*-\n"))
    

    Il suffit donc d'évaluer la fonction ci-dessus pour l'instant; il sera utilisé à une étape ultérieure ci-dessous.

  2. Faites M-x diredet ouvrez le répertoire contenant les fichiers dans lesquels vous souhaitez exécuter la fonction ci-dessus.
  3. Marquez tous ces fichiers à l'aide de la mclé (liée à dired-markin dired).
  4. * étape magique * : faites C-u @et sélectionnez le nom de la fonction que vous avez évaluée à l'étape 1 ( my/set-org-mode). @est lié à diredp-do-apply-functionce qui est défini dans dired+.el.
  5. Boom! La ligne "- * - mode: org - * -" sera ajoutée en haut de tous les fichiers marqués. Mais les choses ne sont pas encore enregistrées. Vous pouvez revoir ce que tout a changé si vous le souhaitez, puis appuyer sur C-x s !pour enregistrer tous les fichiers modifiés en une seule fois.

1 : Inspiré de cette question sur reddit .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.