我有一个BufWritePost
autocmd,我想在每次写入缓冲区时运行它但不是当 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
(这是我原来问题的解决方案,但不是问题本身。)