Vim uruchamia autocmd na wszystkich typach plików z wyjątkiem

Mam vim autocmd, który usuwa końcowe spacje w plikach przed zapisem. Chcę to prawie 100% czasu, ale jest kilka typów plików, które chciałbym go wyłączyć. Konwencjonalną mądrością jest lista typów plików, z którymi ma być uruchomiony autocmd na liście rozdzielonej przecinkami, np.:

autocmd BufWritePre *.rb, *.js, *.pl
Ale w tym przypadku byłoby to uciążliwe.

Czy istnieje sposób na dopasowanie wzorca autocmd do wszystkich plików poza tymi pasującymi do wzorca? Nie mogę znaleźć odpowiednika nie matcher w docs.

Author: Mateusz Piotrowski, 2011-06-27

3 answers

*.rb nie jest typem pliku. To wzór akt. ruby jest typem pliku i może być nawet ustawiony na plikach, które nie mają rozszerzenia .rb. Tak więc, to, co najprawdopodobniej chcesz to funkcja, że autocmd wywołuje zarówno sprawdzić typów plików, które nie powinny być wykonywane na i usuwa białe znaki.

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

autocmd BufWritePre * call StripTrailingWhitespace()

Bazując na odpowiedzi Evana, możesz sprawdzić zmienną bufor-local i określić, czy zrobić pasek za pomocą tego. Pozwoli to również na jednorazowe wyłączenie, jeśli zdecydowałem, że nie chcesz usuwać bufora, który jest typem pliku, który normalnie byś rozebrał.

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
 49
Author: jamessan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 12:29:29

Inny wybór jednej linii drogi:

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

Wtedy możesz zrobić coś, co lubisz dla wszystkich typów plików z wyjątkiem tych z czarnej listy.

 43
Author: wedgwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-04 17:07:14

Najprostszym sposobem byłoby ustawienie zmiennej lokalnej dla typu one filetype na true. Następnie Ustaw polecenie automatyczne, jeśli ta zmienna jest false (jeśli jest ustawiona dla wszystkich innych) lub jeśli w ogóle istnieje(nie trzeba jej ustawiać).

autocmd BufWritePre *.foo let b:foo=true

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

Zmieniono prefiksy zmiennych na podstawie komentarza

 11
Author: evan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-10 15:17:24