У меня есть BufWritePost
autocmd, который я хочу запускать каждый раз, когда буфер записывается , но не , когда Vim собирается завершить работу.
Переменная v: dying
на самом деле не помогает, поскольку она только указывает, существует ли Vim из-за сигнала, но я также хочу обнаружить нормальное завершение работы. Итак, я ищу что-то вроде
au BufWritePost * if ! s:do_we_quit() | Neomake | endif
, но на данный момент я не знаю, как написать тест s: do_we_quit ()
.
Контекст:
Autocmd просто вызывает : Neomake
для выполнения синтаксических проверок и линтеров моих файлов и загрузки их в список quickfix / location. Но это, очевидно, имеет смысл только на : w
, а не на : wq
. Обычно Neomake
работает асинхронно, но при выходе мне кажется, что vim зависает и ждет Neomake
, а затем каким-то образом оказывается в бесконечном цикле.
Вы ищете QuitPre
:
let s:quitting = 0
autocmd QuitPre * let s:quitting = 1
autocmd BufWritePost * if ! s:quitting | Neomake endif
Предполагается, что у вас достаточно недавний Vim ( QuitPre
был добавлен в Vim 7.3.544).
Вам, вероятно, следует опубликовать отчет об ошибке о бесконечном цикле.
Основываясь на ответе Сато, я пришел к следующему:
let s:quitting = 0
autocmd BufWritePost *
\ if ! s:quitting |
\ Neomake |
\ elseif tabpagenr('$') > 1 || winnr('$') > 1 |
\ let s:quitting = 0 |
\ endif
autocmd QuitPre * let s:quitting = 1
s: выход из
должен быть сброшен после закрытия окна, иначе Neomake
не будет работать на следующем : w
где угодно. QuitPre
, так как это может быть что угодно, если я : wqa
Neomake
, если Я закрываю окно, так как могу закрыть все последующие окна вскоре после (до завершения Neomake
), а затем Neovim все равно зависнет NeoVim также предоставляет v: выход
], но он еще не установлен на момент запуска BufWritePost
.
Neomake теперь предоставляет команду NeomakeCancelJobs
, поэтому исходная проблема решается принудительной отменой всех запущенных заданий в VimLeave
:
augroup LucNeoMake
autocmd!
autocmd BufWritePost * Neomake
autocmd VimLeave * NeomakeCancelJobs
augroup END
(Это решение для моя первоначальная проблема, но не вопрос.)