Vim eseguire autocmd su tutti i tipi di file TRANNE

Ho un autocmd Vim che rimuove lo spazio vuoto finale nei file prima di scrivere. Lo voglio quasi il 100% delle volte, ma ci sono alcuni tipi di file che mi piacerebbe disabilitare. La saggezza convenzionale è di elencare i tipi di file in cui si desidera eseguire un autocmd in un elenco separato da virgole, ad esempio:

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

Ma in questo caso sarebbe oneroso.

C’è un modo per abbinare un modello autocmd a tutti i file, eccetto quelli che corrispondono al modello? Non riesco a trovare l’equivalente di un matcher NOT nei documenti.

*.rb non è un tipo di file. È un modello di file. ruby è il tipo di file e potrebbe anche essere impostato su file che non hanno un’estensione .rb . Quindi, quello che più probabilmente vuoi è una funzione che il tuo autocmd chiama per controllare i tipi di file che non dovrebbero essere interpretati e toglie lo spazio bianco.

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

Basandosi sulla risposta di Evan, è ansible verificare la presenza di una variabile locale del buffer e determinare se utilizzare la striscia. Questo ti permetterebbe anche di fare una distriggerszione una tantum se decidessi che non vuoi rimuovere un buffer che è un tipo di file che normalmente verrebbe rimosso.

 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 

Un’altra scelta di un modo di linea:

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

Quindi puoi fare qualcosa che ti piace per tutti i tipi di file, tranne quelli in lista nera.

Il modo più semplice sarebbe quello di impostare una variabile locale per l’unico tipo di file su true. Quindi imposta il comando automatico se quella variabile è falsa (se impostata per tutto il resto) o se esiste (non è necessario preimpostarla).

 autocmd BufWritePre *.foo let b:foo=true if !exists("b:foo") autocmd ... endif 

cambiato prefissi variabili in base al commento