2011-06-27 16 views
59

Posiadam autocmd Vima, który usuwa końcowe spacje w plikach przed zapisem. Chcę tego prawie w 100% przypadków, ale jest kilka rodzajów plików, które chciałbym wyłączyć. Konwencjonalna mądrość jest do listy filetypes chcesz mieć autocmd uruchomić przeciwko na liście oddzielone przecinkami, npAutomatyczne uruchamianie Vima we wszystkich typach plików Z WYJĄTKIEM

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

Ale w tym przypadku będzie to uciążliwe.

Czy istnieje sposób, aby dopasować wzorzec autocmd do wszystkich plików Z WYJĄTKIEM pasujących do wzorca? Nie mogę znaleźć odpowiednika NOT Matchera w dokumentach.

Odpowiedz

44

*.rb nie jest typem pliku. To jest wzorzec pliku. ruby jest typem pliku i może nawet być ustawiony na pliki, które nie mają rozszerzenia .rb. Tak więc, najprawdopodobniej chcesz, aby funkcja, którą wywołuje twój autocmd, zarówno sprawdzała typy plików, które nie powinny działać, jak i usuwała 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 odpowiedź Evana, można sprawdzić zmiennej buforowej lokalnego i ustalić, czy zrobić pasek za pomocą tego. Umożliwiłoby to również wyłączenie jednorazowe, jeśli zdecydujesz, że nie chcesz usuwać bufora, który jest typem pliku, który normalnie zostanie usunięty.

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

Mam nadzieję, że wzór, który wykluczy niektóre rozszerzenia plików i zdecydowanie nadużywane warunki w moim opisie. Podczas gdy miałem nadzieję na jeden liniowiec, zawijanie logiki w funkcję i wywoływanie jej nie jest zbyt odrapane. Dzięki! – jerodsanto

10

Najprostszym sposobem byłoby ustawienie zmiennej lokalnej dla jednego typu pliku na true. Następnie ustaw komendę automatyczną, jeśli ta zmienna ma wartość false (jeśli jest ustawiona na wszystko inne) lub jeśli istnieje w ogóle (nie ma potrzeby jej wstępnego ustawiania).

autocmd BufWritePre *.foo let b:foo=true 

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

zmienił zmienne przedrostków na podstawie komentarza

40

Kolejny wybór jednego wiersza sposób:

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

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

Powiązane problemy