autocmdがあり、BufWritePost
バッファに書き込むたびにそれを実行したいと思います。しかし、Vimが終了しようとしたとき。
この変数は、シグナルv:dying
のためにVimが生きているかどうかを示すため、実際には役に立ちません。しかし、私は通常のシャットダウンも検出したいと思います。だから私は次のようなものを探しています。
au BufWritePost * if ! s:do_we_quit() | Neomake | endif
s:do_we_quit()
しかし、これまで私はテストを書く方法がわかりません。
コンテキスト::Neomake
autocmdは私のファイルに対して構文チェックとリンターの実行を呼び出し、それをクイックフィックス/ロケーションリストにロードします。しかし、これは明らかにon:w
ではなくonでのみ意味があります:wq
。通常は非同期で動作しますが、vimがシャットダウンしたときに停止して待機しても何らかの方法で無限ループに陥るようNeomake
です。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
- また、1つのウィンドウを閉じても実行したくありません。
Neomake
なぜなら、仕事を終えた直後に他のすべてのウィンドウを閉じるからです。Neomake
その後、Neovimはまだ中断されます。
アップデート1
NeoVimもこれを提供しますが、v:exiting
トリガー時にまだ設定されていません。BufWritePost
アップデート2
NeomakeCancelJobs
Neomakeは実行中のすべてのタスクを強制的にキャンセルして元の問題を解決するコマンドを提供しますVimLeave
。
augroup LucNeoMake
autocmd!
autocmd BufWritePost * Neomake
autocmd VimLeave * NeomakeCancelJobs
augroup END
(これは元の問題に対する解決策でしたが、問題自体ではありません。)