检测 Vim 是否会从 autocmd 中退出

检测 Vim 是否会从 autocmd 中退出

我有一个BufWritePostautocmd,我想在每次写入缓冲区时运行它但不是当 Vim 即将退出时。

该变量v:dying并没有真正的帮助,因为它仅指示 Vim 是否由于信号而存在,但我也想检测正常关闭。所以我正在寻找类似的东西

au BufWritePost * if ! s:do_we_quit() | Neomake | endif

但到目前为止我不知道如何编写s:do_we_quit()测试。

语境: autocmd 只是调用:Neomake对我的文件运行语法检查和 linter,并将它们加载到快速修复/位置列表中。但这显然只在 上有意义:w,而在 上则不然:wq。通常是Neomake异步工作的,但在我看来,退出时 vim 会挂起并等待Neomake,然后不知何故它会陷入无限循环。

答案1

您正在寻找QuitPre

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

这假设您正在运行最近的 Vim(QuitPre在 Vim 7.3.544 中添加)。

您可能应该发布有关无限循环的错误报告。

答案2

根据佐藤的回答我想出了这个:

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:quitting关闭窗口后必须重置,否则Neomake将无法在下一个:w任何地方运行。
  • 我无法检查窗口号,QuitPre因为它可能是任何东西,如果我:wqa
  • 另外,如果我关闭一个窗口,我真的不想运行,Neomake因为我可能会在完成后不久关闭所有其他窗口,Neomake然后 Neovim 仍然会挂起

更新1

NeoVim 也提供了,但在触发v:exiting时尚未设置。BufWritePost

更新2

Neomake 现在提供了一个命令NeomakeCancelJobs,因此通过强制取消所有正在运行的作业来解决原始问题VimLeave

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

(这是我原来问题的解决方案,但不是问题本身。)

相关内容