2011-08-19 1 views
15

Ho un sacco di file sass e il mio designer ha usato la sintassi sbagliata. Volevo :margin-top 1px ma ha fatto margin-top: 1pxVIM, Esegui un comando su più file

Così ho scritto un comando facilmente sub:

:rubydo sub! /([\w-]+):/,':\1' 

Così che funziona e risolve tutti i due punti e li sposta nel posto che voglio. Ho circa 50 file sass in una directory stylesheets. Come posso eseguire questo comando su tutti i miei file in un colpo solo? Non sono davvero sicuro di come andare su questo in vim. Forse qualcosa a che fare con grep? Non potrei dirtelo.

risposta

22

vedere questo: http://vimdoc.sourceforge.net/htmldoc/editing.html#:argdo

ho imparato questo comando in questo momento, ma l'aiuto è chiaro.

Go per:

:args *.css 
:argdo %s/\([[:alpha:]-]\+\):/:\1/ge | update 
+0

+1 per' argdo', 'bufdo' è troppo generica. Puoi anche creare un elenco di argomenti locale alla finestra con ': argl' se non vuoi modificare la tua lista di argomenti globali. –

+2

Ho trovato molto utile questo articolo su questo argomento: http://www.ibrahim-ahmed.com/2008/01/find-and-replace-in-multiple-files-in.html – webdesserts

6

Ecco un esempio

:bufdo %s/oldStuff/newStuff/ge | update 

basta cambiare la tua regex base alle proprie esigenze

+0

maggiori informazioni ': aiutare bufdo' –

2

Un paio di passaggi.

:vimgrep /^[^:]\w+/ %:p:h/* " find all of the lines that don't start with a colon 

In questo modo tutte le partite verranno inserite nell'elenco di rapide.

Quindi una macro per fare ciò che si desidera.

qa 
I:<esc> 
f:x 
:w|cn<enter> 
q 

Poi testare quella macro un paio di volte (con @a). Poi un'altra macro per eseguire tale macro più e più volte ...

qbq " this clears out b before starting, very important! 
[email protected]@bq 
@b " watch in amazement. :) 
5

Penso che il miglior strumento per questo caso è sed, l'editor di flussi.

sed -i.old 's/:\([-a-z]*\)/\1:/' *.css 

Questo permetterà di modificare tutti i vostri CSS file lasciando quelli originali con i old estensioni.

Il set di espressioni regolari utilizzato da sed è leggermente diverso e dipende dalla versione più o meno limitata. L'espressione che ho usato apparentemente funziona bene per il tuo caso, con lo strumento BSD.