Vim uruchamia autocmd na wszystkich typach plików Z WYJĄTKIEM

81

Mam autocmd Vima, który usuwa końcowe białe znaki z plików przed zapisem. Chcę tego prawie w 100% przypadków, ale jest kilka typów plików, które chciałbym wyłączyć. Konwencjonalna mądrość polega na umieszczeniu typów plików, z którymi ma działać autocmd, na liście oddzielonej przecinkami, np .:

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

Ale w tym przypadku byłoby to uciążliwe.

Czy istnieje sposób dopasowania wzorca autocmd do wszystkich plików Z WYJĄTKIEM tych pasujących do wzorca? Nie mogę znaleźć odpowiednika dopasowania NIE w dokumentach.

jerodsanto
źródło

Odpowiedzi:

66

*.rbnie jest typem pliku. To wzór pliku. rubyjest typem pliku i można go nawet ustawić dla plików, które nie mają .rbrozszerzenia. Więc to, czego najprawdopodobniej potrzebujesz, to funkcja, którą autocmd wywołuje, aby zarówno sprawdzić typy plików, na których nie należy wykonywać działań, jak 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()

Opierając się na odpowiedzi evana, możesz sprawdzić, czy występuje zmienna lokalna w buforze i zdecydować, czy wykonać rozłożenie, używając jej. Umożliwiłoby to również jednorazowe wyłączenie, gdybyś zdecydował, że nie chcesz usuwać bufora, który jest typem pliku, który normalnie byś usunął.

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
źródło
1
Tak, liczyłem na wzorzec, który wykluczałby niektóre rozszerzenia plików i zdecydowanie nadużył terminów w moim opisie. Podczas gdy ja liczyłem na jednowierszowy, zawinięcie logiki w funkcję i nazywanie jej nie jest zbyt odrapane. Dzięki!
jerodsanto
Jeśli chcesz, aby konfiguracja vima była bardziej modularna, możesz dodać ustawienie let b:noStripWhitespacedo plików w sekcji wtyczek typu pliku. Fx, aby wyłączyć usuwanie końcowych białych znaków dla zatwierdzeń git, dodaj linię do ~/.vim/ftplugin/gitcommit.vim.
flyingdutchman
58

Inny wybór jednej linii:

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

Następnie możesz zrobić coś, co lubisz dla wszystkich typów plików z wyjątkiem tych na czarnej liście.

Wedgwood
źródło
15

Najłatwiejszym sposobem byłoby ustawienie zmiennej lokalnej dla jednego typu pliku na wartość true. Następnie ustaw automcommand, jeśli ta zmienna jest fałszywa (jeśli jest ustawiona dla wszystkiego innego) lub jeśli w ogóle istnieje (nie ma potrzeby jej ustawiania).

autocmd BufWritePre *.foo let b:foo=true

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

zmieniono przedrostki zmiennych na podstawie komentarza

evan
źródło
1

Działa to w przypadku Syntaxautokomend, gdzie wzorzec ( <match>) jest po prostu typem pliku. Nie obejmuje żadnych rstplików:

au Syntax *\(^rst\)\@<! …
niebieskawy
źródło
1

Nasz plik konfiguracyjny .vimrc działa tylko raz przy starcie. Więc jeśli teraz umieścisz test if, nie zadziała, ponieważ żaden plik Pythona nie jest obecnie edytowany.

Ale możesz użyć .vimrc, aby ustawić automatyczne zachowanie: coś, co vim zrobi za każdym razem, gdy napotka specjalny warunek. Warunek może być w Twoim przypadku: „Trwa edycja nowego pliku, którego typ to„ python ””. Zobacz: h: au

xinyu yang
źródło