Esegui il comando per più file
Mi trovo spesso nella situazione in cui voglio eseguire più vimcomandi su più file.
Considera file1.txt, file2.txt, file3.txt che avrei bisogno di eseguire :retabe poi alcuni :%s/ /, /per esempio.
Come posso pipefarcela vim?
Risposte
Primo, stai eseguendo Vim, non Vi, perché quest'ultimo non offre il retabcomando.
Supponendo che il file debba essere modificato (questo è ciò che xfa di seguito), puoi reindirizzare i comandi alla modalità Ex migliorata in questo modo:
printf '%s\n' 'retab' '%s/ /, /' 'x' | vim -E file1.txt
Ora, tenete a mente che Ex salterà la vostra .vimrc, quindi retabnon sarà prendere tabstope expandtabvalori da quel file. Naturalmente, puoi semplicemente fornirli manualmente, ad esempio,
printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E file1.txt
Per operare su vari file (corrispondenza file[digit].txt), basta avvolgerlo in un ciclo di shell
for file in file[0-9].txt; do
printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E "$file"
done
È possibile utilizzare l' -cargomento nella riga di comando per eseguire comandi in Vim dopo aver aperto un file. Puoi passarlo più volte per eseguire i diversi comandi separati. Dopo aver eseguito i comandi di modifica, probabilmente vorrai includere un :wqper fare in modo che Vim salvi le modifiche e esca.
$ vim -c 'retab' -c '%s/ /, /' -c 'wq' file1.txt
Ovviamente puoi usarlo all'interno di un forciclo per eseguirlo su ciascuno dei tuoi file di testo.
Un'altra opzione è aprire tutti i file in Vim e quindi utilizzare :argdoper eseguire una sequenza di comandi in tutti i file nell'elenco degli argomenti. In tal caso, dovresti unire tutti i tuoi comandi usando |(che è il separatore di comandi in Vim) e dovresti terminare ciascuno :argdocon un in :updatemodo che salvi il file (se necessario) prima di procedere a quello successivo. Questo è importante, altrimenti Vim potrebbe rifiutarsi di allontanarsi dal buffer corrente, interrompendo la tua :argdoesecuzione.
$ vim file*.txt
Quindi all'interno di Vim:
:argdo retab | %s/ /, / | update
Tutti i tuoi file saranno stati aggiornati e sarai nell'ultimo file nella tua lista di argomenti. A questo punto puoi semplicemente uscire da Vim con :q.
Con il codice seguente, apri tutti i file in vim, quindi esegui :Bufdo retab
function! Bufdo(command)
let curbuf=bufnr("%")
execute 'bufdo ' . a:command
execute 'buffer ' . curbuf
endfunction
command! -nargs=+ -complete=command Bufdo call Bufdo(<q-args>)