Komenda autocommand jest wykonywana, gdy wystąpi jedno zdarzenie. Chcesz, aby polecenie zostało wykonane po wystąpieniu sekwencji zdarzeń. Można to zrobić w następujący sposób:
autocmd FileType c,cpp,python
\ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()
<buffer>
Wzór powoduje autocommand się być wyzwalane, gdy bieżący bufor jest napisane. Widzieć
:help autocmd-buflocal
Aktualizacja
Powyższe rozwiązanie jest dość proste i ma pewne wady, które zostały omówione w komentarzach. Oto bardziej kompletne rozwiązanie, które usuwa niektóre z tych wad. Umieszcza automatyczne polecenia w grupie i usuwa automatyczne polecenie BufWritePre, jeśli istnieje, przed utworzeniem nowego. Nadal tworzy jedną komendę automatyczną na bufor, ale tylko jedną.
augroup TrailSpace
autocmd FileType c,cpp,python
\ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END
Innym rozwiązaniem, podobnym do odpowiedzi wysłanej przez lcd047, teraz usuniętą, jest rozpoznanie, że gdy wystąpi zdarzenie FileType, ustawiana jest opcja „filetype”. Następnie możesz uzależnić odpowiedź na zdarzenie BufWritePost od wartości „filetype”, jak w poniższym przykładzie. Ma tę przewagę nad innymi rozwiązaniami, że tworzona jest tylko jedna komenda automatyczna.
autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
\ | call SkipTrailingWhiteSpaces()
\ | endif
FileType
autocmd w odpowiedzi już ustawiłby drugi autocmd (BufWritePre
) do uruchomienia podczas zapisywania.FileType
autocmd uruchomi się dla każdego pliku, który otworzysz z poprawnym typem pliku, i skonfiguruje zdarzenie lokalne dla każdego z tych plików. Więc jeśli uruchomisz:wa
, vim uruchomi zarejestrowane zdarzenia dla każdego bufora, przed zapisaniem do pliku.autocmd
s zamiast jednego, wszystkie w trakcie zapisu. Jeśli, powiedzmy, 3 z tych plików zostaną ukryte, a następnie pokazane ponownie, zostaną ponownieFileType
uruchomione, aby uzyskać jeszcze 3autocmd
s, również podczas zapisu. To jest genialne, zastanawiam się, dlaczego nie wymyśliłem tego rozwiązania. :)stripTrailingWhiteSpaces()
kilka razy dla tego samego pliku może mieć niezamierzone konsekwencje. Ponadto, im więcejautocmd
masz czasu na to samo wydarzenie dla tego samego pliku, tym większe prawdopodobieństwo, że spotkasz się z naprawdę poważnymi warunkami wyścigowymi. Spróbuj przeszukać archiwa vim_dev, aby uzyskać pomysł. Z drugiej strony, co wiem, to może po prostu działać dla ciebie, prawda?Mówiąc bardziej ogólnie, jeśli nie wiesz, które zdarzenie nastąpi jako pierwsze, możesz użyć pomocnika do śledzenia, kiedy każdy z nich strzela, i wykonać polecenie tylko, gdy ostatni z nich strzela:
źródło