Esegui il comando per più file

Sep 17 2020

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

4 Quasímodo Sep 17 2020 at 23:17

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
2 filbranden Sep 18 2020 at 00:21

È 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.

WW00WW Sep 20 2020 at 09:56

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