Executar comando para vários arquivos
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
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
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.
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>)