Vim ejecuta autocmd en todos los tipos de archivo EXCEPTO

81

Tengo un autocmd de Vim que elimina los espacios en blanco finales en los archivos antes de escribir. Quiero esto casi el 100% del tiempo, pero hay algunos tipos de archivo que me gustaría que se deshabilitaran. La sabiduría convencional es enumerar los tipos de archivos con los que desea que se ejecute un autocmd en una lista separada por comas, por ejemplo:

autocmd BufWritePre *.rb, *.js, *.pl

Pero en este caso eso sería oneroso.

¿Hay alguna forma de hacer coincidir un patrón autocmd con todos los archivos EXCEPTO los que coinciden con el patrón? No puedo encontrar el equivalente a un NO coincidente en los documentos.

jerodsanto
fuente

Respuestas:

66

*.rbno es un tipo de archivo. Es un patrón de archivo. rubyes el tipo de archivo e incluso podría configurarse en archivos que no tienen .rbextensión. Entonces, lo que probablemente desee es una función que su autocmd llame para verificar los tipos de archivos sobre los que no se debe actuar y eliminar el espacio en blanco.

fun! StripTrailingWhitespace()
    " Don't strip on these filetypes
    if &ft =~ 'ruby\|javascript\|perl'
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()

Sobre la base de la respuesta de evan, puede verificar una variable local de búfer y determinar si debe hacer la tira con eso. Esto también le permitiría realizar una desactivación única si decidiera que no desea eliminar un búfer que es un tipo de archivo que normalmente eliminaría.

fun! StripTrailingWhitespace()
    " Only strip if the b:noStripeWhitespace variable isn't set
    if exists('b:noStripWhitespace')
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()
autocmd FileType ruby,javascript,perl let b:noStripWhitespace=1
jamessan
fuente
1
Correcto, esperaba un patrón que excluyera ciertas extensiones de archivo y definitivamente usó mal los términos en mi descripción. Mientras esperaba una sola línea, envolver la lógica en una función y llamarla no está nada mal. ¡Gracias!
jerodsanto
Si desea que su configuración de vim sea más modular, puede agregar la configuración let b:noStripWhitespaceen los archivos en la sección del complemento de tipo de archivo. Fx para deshabilitar la eliminación de espacios en blanco finales para las confirmaciones de git, agregue la línea a ~/.vim/ftplugin/gitcommit.vim.
Flyingdutchman
58

Otra opción de una forma de línea:

let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like

Luego, puede hacer algo que le guste para todos los tipos de archivos, excepto los de la lista negra.

Wedgwood
fuente
15

La forma más sencilla sería establecer una variable local para el tipo de archivo en verdadero. Luego configure el comando automático si esa variable es falsa (si está configurada para todo lo demás) o si existe (no es necesario preestablecerla).

autocmd BufWritePre *.foo let b:foo=true

if !exists("b:foo")
    autocmd ...
endif

prefijos de variable cambiados según el comentario

evan
fuente
1

Esto funciona para los Syntaxcomandos automáticos, donde el patrón ( <match>) es solo el tipo de archivo. Excluye cualquier rstarchivo:

au Syntax *\(^rst\)\@<! …
azulado
fuente
1

Nuestro archivo de configuración .vimrc se ejecuta solo una vez al inicio. Entonces, si pones una prueba if en este momento, no funcionará, porque no se está editando ningún archivo Python.

Pero puede usar .vimrc para configurar un comportamiento automático: algo que vim hará cada vez que encuentre una condición especial. La condición puede ser en su caso: "Se está editando un nuevo archivo y su tipo de archivo es 'python'". Ver: h: au

xinyu yang
fuente