2013-01-12 12 views
6

Esiste un modo per eseguire il comando emacs su più buffer senza doverli selezionare singolarmente ed eseguirlo su ogni singolo buffer.Esegui un comando particolare su più buffer di emacs

Di solito apro più file corrispondenti a un'espressione regolare, ad es. ~/*.py e si desidera abilitare una modalità particolare, ad esempio hs-minor-mode o glasses-mode su ognuno di essi, oppure dire eseguire C-c @ C-M-h su ciascuno. Attualmente devo selezionare ognuno di essi e farlo individualmente. Quindi c'è un hack o un loop per automatizzare l'attività.

Diciamo che contrassegno i buffer dall'elenco buffer e poi eseguo il comando per tutti quelli contrassegnati.

ho provato this ma dopo l'esecuzione dei comandi in eval-expression ho perso completamente l'accesso al mio minibuffer, che significa ogni volta che ho digitato M-x minibuffer restituito questo

in grado di accedere l'errore emacs minibuffer "Modo Processo Menu doesn' supporto t NascondiMostra modo minore"

e sono stato costretto ad uccidere in realtà l'intero processo di emacs, perché il C-x C-s non funzionava nessuno dei due era la Termina operazione.

PS: Non ho esperienza in elisp

risposta

10

È possibile utilizzare la modalità ibuffer per questo (è parte della distribuzione di default di Emacs).

(global-set-key "\C-x\C-b" 'ibuffer) ;; make ibuffer the default 

In *Ibuffer* è possibile contrassegnare i buffer richiesti con m e poi eseguire un modulo in ciascuno con E.

Generalmente, ibuffer è molto più flessibile della solita lista di buffer e penso che debba essere in realtà l'elenco di buffer predefinito in Emacs.

Se si fa questo, spesso, si potrebbe desiderare di cambiare queste modalità particolari su ogni volta che si entra in modalità di pitone da loro fissaggio alla modalità-hook:

(add-hook 'python-mode-hook 'hs-minor-mode) 
(add-hook 'python-mode-hook 'glasses-mode) 
+0

Sono d'accordo, probabilmente i ganci sono il modo migliore per andare. Se non li vuoi, sarebbe più facile disattivare la modalità per alcuni buffer singoli! – PascalVKooten

2

non sapevo ibuffer avuto quella caratteristica ! Ad ogni modo, per chi ha più familiarità con Dired, ecco un comando che fa lo stesso. Seleziona i file nella directory con m o qualsiasi altro metodo più potente. Quindi, M-xdired-do-command e scrivi un modulo o un comando esattamente come in M-x.

(defun 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 
    (list 
    (let ((print-level nil) 
      (minibuffer-history-position 0) 
      (minibuffer-history-sexp-flag (1+ (minibuffer-depth)))) 
     (unwind-protect 
      (read-from-minibuffer 
      "Command: " (prin1-to-string (nth 0 command-history)) 
      read-expression-map t 
      (cons 'command-history 0)) 

     ;; If command was added to command-history as a 
     ;; string, get rid of that. We want only 
     ;; evaluable expressions there. 
     (if (stringp (car command-history)) 
      (setq command-history (cdr command-history))))))) 
    (dolist (filename (dired-get-marked-files)) 
    (with-current-buffer (find-file-noselect filename) 
     (if (symbolp command) 
      (call-interactively command) 
     (eval command))))) 
Problemi correlati