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.
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
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.
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
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