Executar comando para vários arquivos

Sep 17 2020

Muitas vezes me encontro na situação em que desejo executar vários vimcomandos em vários arquivos.

Considere file1.txt, file2.txt, file3.txt que eu precisaria para executar :retabe alguns, :%s/ /, /por exemplo.

Como posso fazer pipeisso vim?

Respostas

4 Quasímodo Sep 17 2020 at 23:17

Primeiro, você está executando o Vim, não o Vi, porque o último não oferece o retabcomando.

Assumindo que o arquivo deve ser modificado (é o que xacontece a seguir), você pode canalizar os comandos para o modo Ex melhorado desta forma:

printf '%s\n' 'retab' '%s/ /, /' 'x' | vim -E file1.txt

Agora, tenha em mente que Ex irá ignorar o seu .vimrc, então retabnão vai demorar tabstope expandtabvalores a partir desse arquivo. Claro, você pode apenas fornecê-los manualmente, por exemplo,

printf '%s\n' 'set expandtab' 'retab' '%s/ /, /' 'x' | vim -E file1.txt

Para operar em vários arquivos (correspondência file[digit].txt), basta envolvê-los em um loop de 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

Você pode usar o -cargumento na linha de comando para executar comandos no Vim após abrir um arquivo. Você pode passá-lo várias vezes para executar os vários comandos separados. Depois de executar os comandos de edição, você provavelmente desejará incluir um :wqpara que o Vim salve suas alterações e saia.

$ vim -c 'retab' -c '%s/ /, /' -c 'wq' file1.txt

Você pode, é claro, usar isso dentro de um forloop para executá-lo em cada um dos seus arquivos de texto.

Outra opção é abrir todos os arquivos no Vim e usar :argdopara executar uma sequência de comandos em todos os arquivos da lista de argumentos. Nesse caso, você deve unir todos os seus comandos usando |(que é o separador de comandos no Vim) e deve terminar cada :argdoum com um :updatepara que o arquivo seja salvo (se necessário) antes de prosseguir para o próximo. Isso é importante, caso contrário, o Vim pode se recusar a se afastar do buffer atual, o que interromperia sua :argdoexecução.

$ vim file*.txt

Então, dentro do Vim:

:argdo retab | %s/ /, / | update

Todos os seus arquivos terão sido atualizados e você estará no último arquivo em sua lista de argumentos. Neste ponto, você pode simplesmente encerrar o Vim com :q.

WW00WW Sep 20 2020 at 09:56

Com o código a seguir, abra todos os arquivos no vim e execute :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>)