2010-06-11 11 views
26

Conosco il comando :bufdo e stavo cercando di combinarlo con una macro che avevo registrato (@a) per aggiungere un #include nel punto corretto di ciascun file di intestazione I ' d caricato. Tuttavia, non ho trovato un modo semplice per eseguire la macro su ciascun buffer. C'è un modo per eseguire una macro attraverso la modalità ex, che è ciò che richiede :bufdo? O c'è un altro comando che mi manca?Esegui una macro in tutti i buffer in vim

+0

un'occhiata a http://stackoverflow.com/questions/1291962/replay-a-vim-macro-until-end-of-buffer EDIT: non importa questo – gruntled

+0

@gruntled: Grazie per il link. L'ho saltato perché la domanda non sembrava applicarsi, ma le tecniche dovrebbero funzionare. Ho votato per chiudere questo. –

risposta

31

si può fare in questo modo:

:bufdo execute "normal @a" | write 

Il comando normale eseguirà la macro, ma deve essere eseguito utilizzando: execute, altrimenti il ​​carattere pipe sarà interpretato come un carattere in modalità normale.

0

L'unica alternativa che potevo ottenere era quella di aggiungere i comandi :w e :bn alla macro, in modo che si salvasse automaticamente e passasse al buffer successivo. Potrei quindi eseguire il comando sugli altri 52 buffer digitando [email protected]. Questo ha funzionato, ma per me è un modello concettuale molto diverso rispetto allo :bufdo e spero che qualcun altro mi indicherà qualcosa di più simile a :bufdo.

11

bisogna usare normal per eseguire i comandi modalità normale, l'esecuzione di tale macro (@a) in modalità comandi:

:bufdo normal @a 
+1

Funziona solo se è abilitato 'autowrite', altrimenti si fermerà con un errore quando tenta di passare al secondo buffer, poiché abbandonerà un buffer modificato. –

+0

@DaveKirby farebbe questo se includessimo: w nella nostra macro? – MeanEYE

+1

@MeanEYE: Sì, se si termina la macro con ': w', questo funziona. –