2011-06-27 24 views
59

Tengo un Vim autocmd que elimina los espacios en blanco finales en los archivos antes de escribir. Quiero esto casi el 100% de las veces, pero hay algunos tipos de archivos que me gustaría deshabilitar. La sabiduría convencional es la lista de los tipos de archivos que desea un autocmd se ejecute en contra en una lista separada por comas, por ejemplo:Vim ejecuta autocmd en todos los tipos de archivos EXCEPTO

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

Pero en este caso sería onerosa.

¿Hay alguna manera 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 matcher NO en los documentos.

Respuesta

44

*.rb no es un tipo de archivo. Es un patrón de archivo. ruby es el tipo de archivo e incluso podría establecerse en archivos que no tienen una extensión .rb. Entonces, lo que probablemente desee es una función a la que llame su autocmd para verificar los tipos de archivos en los que no se debe actuar y eliminar los espacios 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 respuesta de Evan, se podría comprobar si hay una variable local al búfer y determinar si se debe hacer uso de la tira de eso. Esto también te permitiría desactivarlo una sola vez si decides que no quieres quitar un buffer que es un tipo de archivo que normalmente quitarías.

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 
+1

Correcto, esperaba un patrón que excluyera ciertas extensiones de archivos y definitivamente hiciera mal uso de los términos en mi descripción. Mientras esperaba un juego de una sola línea, envolver la lógica en una función y llamarla no está nada mal. ¡Gracias! – jerodsanto

10

La manera más fácil sería establecer una variable local para el tipo de archivo en verdadero. A continuación, configure el comando autom si esa variable es falsa (si está configurada para todo lo demás) o si existe (no es necesario preconfigurarla).

autocmd BufWritePre *.foo let b:foo=true 

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

cambió prefijos variables basados ​​en comentario

40

Otra elección de una línea manera:

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

entonces usted puede hacer algo que le guste para todos los tipos de archivos, excepto aquellos en lista negra.

Cuestiones relacionadas