Como executar uma função ou macro em uma pasta de arquivos?

Respostas:

10

Você pode usar o -cargumento para executar um comando na inicialização, em vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Exemplo:

vim -c ':call StripWhitespace()' file1 file2

Para sair depois, adicione | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2
Martin Tournoij
fonte
1
Você quer um: argdo, se você executar este por um par de arquivos na linha de comando
Christian Brabandt
19

Se você já estiver no Vim, poderá usar os comandos :argdoou :bufdopara executar um comando em todos os itens da lista de argumentos ou da lista de buffers, respectivamente.

por exemplo, para executar um :comando em todos os arquivos da lista de argumentos:

:argdo StripWhitespace

Ou para invocar uma função de cada arquivo na lista de buffers:

:bufdo call StripWhitespace()

Ou, para executar a macro qem todos os arquivos da lista de argumentos:

:argdo normal @q

Você pode salvar todos os buffers alterados com :wallou salvar todos e sair do Vim com :wqall.

Se você quiser gravar os arquivos à medida que avança, poderá adicionar uma chamada para :update:

:argdo s/foo/bar/ge | update

Existem várias maneiras de obter os arquivos no Vim em primeiro lugar, incluindo:

  • Forneça parâmetros para a linha de comando do vim: vim *(isso adiciona todos os arquivos à lista de argumentos),
  • Use o :argscomando (que suporta expressões curinga e backtick) para preencher a lista de argumentos ou o :argaddcomando para adicionar arquivos a ela,
  • Basta abrir-los todos manualmente com :e, :Exou um plugin arquivo de abertura.
Rico
fonte
1
Gosto dessa resposta porque ela não exige a saída do Vim, o que, na minha opinião, é muito caro (minha preciosa lista de buffers!). Tenho algumas anotações: (1) deixar buffers sem escrever precisa 'hidden'ser definido; (2) o : updatecomando é uma ligeira melhoria em relação :wporque ele só escreve se uma alteração foi feita, por isso :bufdo updateou :argdo updatevai escrever todos os tampões ou argumentos modificados.
tommcdo
Bom ponto update. Pensei em mencionar hiddenquando estava escrevendo a resposta, mas decidi contra, porque não queria complicar demais. Na reflexão, porém, deveria estar lá. Atualizarei a resposta para incluir as duas sugestões atualmente.
Rich
@tommcdo Acabei de verificar a documentação para: wall, e ele escreve apenas buffers alterados, portanto: a atualização do bufdo não é necessária, afinal.
Rich
boa captura :wall, que também tem a vantagem de não percorrer os amortecedores e afastá-lo de onde você começou. Suponho que :argdo updateainda seja uma história diferente - talvez você não queira escrever para buffers que não estão na sua lista de argumentos.
tommcdo
@tommcdo Bom ponto.
Rich