概要
vim-watchdogsというプラグインを使っていて気になった、掲題の問題を設定で頑張って回避した、というお話です。
問題
上記のvim-watchdogsというプラグイン、
設定するとファイルを保存した時に自動でチェック用のコマンドを非同期で実行し、結果をquickfix listなどに出してくれるという優れものです。
syntasticの非同期実行版といえば通じる方もいらっしゃるでしょう。
私はこのvim-watchdogsで、比較的実行時間が長くかかるRubocopやESLintを実行しているのですが、一つ困った問題がありました。
コマンドの実行結果がquickfix listに表示された後、quickfix listにカーソルが意図せず飛んでしまうのです。
実際にはそれ自体は仕様なのですが、私の利用環境では次のような問題がありました。
- 既存の大抵のファイルにおいて保存時に大量にエラーが出てしまうため、優先して編集したいことに集中できない。
- プロジェクトのコードベースが大きくなってからRubocopを導入したので...。
- しかもそれが非同期に発生するため「とりあえず一旦保存する」=>「他の箇所を編集」している間にカーソルがquickfix listに飛び、ますますイラッとくる。
解決方法
vim-watchdogsが依存している、vim-quickrunの設定をいじりました。
のように変えましょう。
function! GoToPreviousWindowIfQfPresent() abort
if!(empty(getqflist()))wincmdpendifendfunctionletg:quickrun_config = {
\ "_": {
\ "outputter/quickfix/open_cmd" : "cwindow | call GoToPreviousWindowIfQfPresent()"
\ },
\ }
私が探した限りドキュメントには見当たらなかったのですが、outputter/quickfix/open_cmd
という箇所に、
コマンドを実行した後、quickfix listを開くときのコマンドを設定できるようです(デフォルトはcwindow
)。
なので、デフォルトのcwindow
コマンドでquickfix listを開い(て、カーソルをquickfix listに移動させ)た後、wincmd p
コマンドで移動させる前のウィンドウに戻るよう設定しました。GoToPreviousWindowIfQfPresent
ではwincmd p
を実行する前にquickfix listが空じゃないかどうか確認しています。
そうしないとエラーがなかった時にウィンドウを複数開いていた場合、無関係なウィンドウに移動してしまうので。