Pregunta En emacs dired, ¿cómo puedo ejecutar un comando en varios archivos marcados?


Tengo varios archivos marcados en modo directo, y me gustaría ejecutar un comando en (digamos (delete-trailing-whitespace) en cada uno de ellos.

¿Existe una forma incorporada de hacer esto, o debo escribirlo yo mismo?

Básicamente, quiero hacer algo como (dired-do-shell-command) pero quiero evaluar una expresión de emacs en lugar de un comando de shell. Quiero hacer esto dentro de emacs en los archivos que he marcado, así que no puedo usar -batch.


4


origen




Respuestas:


Escribí algo para hacer lo que quiero, en caso de que alguien más lo encuentre útil:

Actualizar: Se actualizó esta solución con un comando de propósito más general.

(defun mrc-dired-do-command (command)
  "Run COMMAND on marked files. Any files not already open will be opened.
After this command has been run, any buffers it's modified will remain
open and unsaved."
  (interactive "CRun on marked files M-x ")
  (save-window-excursion
    (mapc (lambda (filename)
            (find-file filename)
            (call-interactively command))
          (dired-get-marked-files))))

Ahora M-x mrc-dired-do-command delete-trailing-whitespace hace lo que quiero

Me encantaría que alguien me dijera que no tenía que hacer esto, y pasé por alto un comando obvio como dired-do-command.


7





AFAIK dired no tiene tales facilidades, pero ibuffer sí lo hace: use dired para marcar todos los archivos que quiera aplicar (m), visítelos (C-u F), ejecutar ibuffer (M-x ibuffer [RET]), marque todos los búferes (m) e invocar ibuffer-do-eval (E), inserte la expresión que desea evaluar en cada buffer, guárdelos todos (S) y cerrarlos (D)


4





Esto no es exactamente lo que pediste, pero podrías marcar buffers en ibuffer y usar 'E' (FORMULARIO ibuffer-do-eval)

Sé que eshell le permite usar elisp para scripts de shell (más o menos), por lo que probablemente pueda hacerlo más fácilmente desde eshell.


1



Gracias shapr, eso es bastante útil, aunque quería hacerlo en directo. - Matt Curtis