Команда автокоманды выполняется, когда происходит одно событие. Вы хотите, чтобы команда была выполнена после того, как произошла последовательность событий. Один из способов сделать это так:
autocmd FileType c,cpp,python
\ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()
<buffer>
Модели приводят к тому , автокоманде быть срабатывать , когда текущий буфер записываются. Видеть
:help autocmd-buflocal
Обновить
Решение выше довольно просто и имеет некоторые недостатки, которые обсуждались в комментариях. Вот более полное решение, которое устраняет некоторые из этих недостатков. Он помещает автокоманды в группу и удаляет автокоманду BufWritePre, если она существует, перед созданием новой. Он по-прежнему создает одну автокоманду на буфер, но только одну.
augroup TrailSpace
autocmd FileType c,cpp,python
\ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END
Другое решение, похожее на ответ, опубликованный lcd047, который теперь удален, заключается в распознавании того, что при возникновении события FileType устанавливается опция 'filetype'. Затем вы можете обусловить ответ на событие BufWritePost значением 'filetype', как в следующем примере. Он имеет преимущество перед другими решениями в том, что создается только одна автокоманда.
autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
\ | call SkipTrailingWhiteSpaces()
\ | endif
FileType
типом файла , autocmd в ответе уже настроил бы второй autocmd (BufWritePre
) для запуска при сохранении их.FileType
Autocmd выше будет срабатывать для каждого файла, открыть с помощью правильного типа файла и настройки Уиллу буфера локального события для каждого из этих файлов. Поэтому, если вы запустите:wa
, vim запустит зарегистрированные события для каждого буфера, прежде чем сохранить в файл.autocmd
секунд вместо одного, все на записи. Затем, если, скажем, 3 из этих файлов будут скрыты, то сноваFileType
отобразятся, снова сработают, и вы получите еще 3autocmd
с, также при записи. Это замечательно, мне интересно, почему я не придумал это решение. :)stripTrailingWhiteSpaces()
несколько раз для одного и того же файла может иметь непредвиденные последствия. Кроме того, чем больше уautocmd
вас одного и того же события для одного и того же файла, тем выше вероятность того, что вы столкнетесь с некоторыми действительно гоночными условиями. Попробуйте поискать в архивах vim_dev, чтобы получить представление. Опять же, что я знаю, это может просто сработать для вас, верно?В более общем смысле, если вы не знаете, какое событие произойдет первым, вы можете использовать помощника, чтобы отслеживать, когда каждый из них срабатывает, и выполнять вашу команду только тогда, когда срабатывает последний:
источник