Questão No emacs dired, como posso executar um comando em vários arquivos marcados?


Eu tenho vários arquivos marcados em dired-mode, e gostaria de executar um comando em (digamos (delete-trailing-whitespace) em cada um deles.

Existe uma maneira interna de fazer isso ou preciso escrevê-lo sozinho?

Basicamente eu quero fazer algo como (dired-do-shell-command) mas eu quero eval uma expressão emacs em vez de um comando shell. Eu quero fazer isso dentro do emacs nos arquivos que eu marquei, então não posso usar -batch.


4


origem




Respostas:


Eu escrevi algo para fazer o que eu quero, no caso de alguém achar útil:

Atualizar: Atualizada esta solução com um comando de propósito geral.

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

Agora M-x mrc-dired-do-command delete-trailing-whitespace faz o que eu quero.

Eu ficaria muito feliz se alguém me dissesse que eu não tinha que fazer isso, e eu negligenciei um comando óbvio como dired-do-command.


7





AFAIK dired não tem tal facilidade, mas ibuffer faz - use dired para marcar todos os arquivos que você deseja efetuar (m), visite-os (C-u F), execute ibuffer (M-x ibuffer [RET]), marque todos os buffers (m) e invocar ibuffer-do-eval (E), insira a expressão que você deseja avaliar em cada buffer, salve todos eles (S) e feche-os (D).


4





Isto não é exatamente o que você pediu, mas você poderia marcar buffers em ibuffer e usar 'E' (ibuffer-do-eval FORM)

Eu sei que o eshell permite que você use o elisp para scripts de shell (tipo), então você provavelmente poderia fazê-lo mais facilmente a partir do eshell.


1



Obrigado shapr, isso é bastante útil, embora eu queira fazer isso em dired. - Matt Curtis