Un comando de autocomando se ejecuta cuando ocurre un evento. Desea que se ejecute un comando después de que se haya producido una secuencia de eventos. Una forma de hacerlo es así:
autocmd FileType c,cpp,python
\ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()
El <buffer>
patrón hace que el autocomando se active cuando se escribe el búfer actual. Ver
:help autocmd-buflocal
Actualizar
La solución anterior es bastante simple y tiene algunos defectos que se discutieron en los Comentarios. Aquí hay una solución más completa que aborda algunos de esos defectos. Pone los comandos automáticos en un grupo y elimina el comando automático BufWritePre, si existe, antes de crear uno nuevo. Todavía crea un autocomando por búfer, pero solo uno.
augroup TrailSpace
autocmd FileType c,cpp,python
\ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END
Otra solución, similar a la respuesta publicada por lcd047, ahora eliminada, es reconocer que cuando ocurre el evento FileType, se establece la opción 'tipo de archivo'. Luego puede condicionar la respuesta al evento BufWritePost en el valor de 'tipo de archivo', como en el siguiente ejemplo. Tiene la ventaja sobre las otras soluciones de que solo se crea un autocomando.
autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
\ | call SkipTrailingWhiteSpaces()
\ | endif
FileType
autocmd en la respuesta ya habría configurado el segundo autocmd (BufWritePre
) para que se dispare cuando los guarde.FileType
autocmd anterior se activará para cada archivo que abra con el tipo de archivo correcto y configurará un evento local de búfer para cada uno de esos archivos. Entonces, si ejecuta:wa
, vim ejecutará eventos registrados para cada búfer, antes de guardar en el archivo.autocmd
s en lugar de uno solo, todo en escritura. Entonces, si, por ejemplo, 3 de estos archivos se ocultan, luego se muestran nuevamente,FileType
se vuelven a activar para que obtenga 3autocmd
s más , también en escritura. Esto es brillante, me pregunto por qué no se me ocurrió esta solución. :)stripTrailingWhiteSpaces()
embargo, ejecutar la función varias veces contra el mismo archivo puede tener consecuencias no deseadas. Además, cuanto másautocmd
tenga para el mismo evento para el mismo archivo, más probabilidades tendrá de encontrarse con algunas condiciones realmente de carrera. Intente buscar archivos vim_dev para tener una idea. Por otra parte, qué sé, podría funcionar para ti, ¿verdad?En términos más generales, si no sabe qué evento sucederá primero, puede usar un ayudante para rastrear cuándo se dispara cada uno y solo ejecutar su comando cuando se dispara el último:
fuente