Vimがautocmdを終了するかどうかを検出する

Vimがautocmdを終了するかどうかを検出する

autocmdがあり、BufWritePostバッファに書き込むたびにそれを実行したいと思います。しかし、Vimが終了しようとしたとき。

この変数は、シグナルv:dyingのためにVimが生きているかどうかを示すため、実際には役に立ちません。しかし、私は通常のシャットダウンも検出したいと思います。だから私は次のようなものを探しています。

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

s:do_we_quit()しかし、これまで私はテストを書く方法がわかりません。

コンテキスト::Neomakeautocmdは私のファイルに対して構文チェックとリンターの実行を呼び出し、それをクイックフィックス/ロケーションリストにロードします。しかし、これは明らかに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(QuitPreVim 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

NeomakeCancelJobsNeomakeは実行中のすべてのタスクを強制的にキャンセルして元の問題を解決するコマンドを提供しますVimLeave

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

(これは元の問題に対する解決策でしたが、問題自体ではありません。)

関連情報