Определить, выйдет ли Vim изнутри autocmd

У меня есть 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 , а затем каким-то образом оказывается в бесконечном цикле.

0
24.02.2017, 11:44
2 ответа

Вы ищете QuitPre :

let s:quitting = 0
autocmd QuitPre      * let s:quitting = 1
autocmd BufWritePost * if ! s:quitting | Neomake endif

Предполагается, что у вас достаточно недавний Vim ( QuitPre был добавлен в Vim 7.3.544).

Вам, вероятно, следует опубликовать отчет об ошибке о бесконечном цикле.

1
28.01.2020, 02:46

Основываясь на ответе Сато, я пришел к следующему:

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 все равно зависнет

Обновление 1

NeoVim также предоставляет v: выход ], но он еще не установлен на момент запуска BufWritePost .

Обновление 2

Neomake теперь предоставляет команду NeomakeCancelJobs , поэтому исходная проблема решается принудительной отменой всех запущенных заданий в VimLeave :

augroup LucNeoMake
  autocmd!
  autocmd BufWritePost * Neomake
  autocmd VimLeave * NeomakeCancelJobs
augroup END

(Это решение для моя первоначальная проблема, но не вопрос.)

0
28.01.2020, 02:46

Теги

Похожие вопросы