Um comando de comando automático é executado quando um evento ocorre. Você deseja que um comando seja executado após a ocorrência de uma sequência de eventos. Uma maneira de fazer isso é assim:
autocmd FileType c,cpp,python
\ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()
O <buffer>
padrão faz com que o comando automático seja acionado quando o buffer atual for gravado. Vejo
:help autocmd-buflocal
Atualizar
A solução acima é bastante simples e possui algumas falhas que foram discutidas nos Comentários. Aqui está uma solução mais completa que aborda algumas dessas falhas. Ele coloca os comandos automáticos em um grupo e exclui o comando automático BufWritePre, se houver, antes de criar um novo. Ele ainda cria um comando automático por buffer, mas apenas um.
augroup TrailSpace
autocmd FileType c,cpp,python
\ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END
Outra solução, semelhante à resposta publicada por lcd047, agora excluída, é reconhecer que quando o evento FileType ocorre, a opção 'filetype' está definida. Em seguida, você pode condicionar a resposta ao evento BufWritePost no valor de 'tipo de arquivo', como no exemplo a seguir. Tem a vantagem sobre as outras soluções que apenas um autocommand é criado.
autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
\ | call SkipTrailingWhiteSpaces()
\ | endif
FileType
autocmd na resposta já teria configurado o segundo autocmd (BufWritePre
) para disparar quando você os salvar.FileType
autocmd acima será acionado para todos os arquivos abertos com o tipo de arquivo correto e configurará um evento local de buffer para cada um desses arquivos. Portanto, se você executar:wa
, o vim executará eventos registrados para cada buffer, antes de salvar no arquivo.autocmd
s em vez de um único, todos gravados . Então, se, digamos, três desses arquivos forem ocultados e exibidos novamente, foremFileType
acionados novamente, você terá mais 3autocmd
s, também na gravação. Isso é brilhante, eu me pergunto por que não criei esta solução. :)stripTrailingWhiteSpaces()
várias vezes no mesmo arquivo pode ter consequências indesejadas. Além disso, quanto maisautocmd
você tiver para o mesmo evento para o mesmo arquivo, maior será a probabilidade de encontrar algumas condições de corrida. Tente pesquisar nos arquivos vim_dev para ter uma idéia. Então, novamente, o que eu sei, pode funcionar para você, certo?De maneira mais geral, se você não souber qual evento ocorrerá primeiro, poderá usar um auxiliar para rastrear quando cada um é acionado e apenas executar seu comando quando o último for acionado:
fonte