(続)watchdogs.vim で、文法エラーがあったときに QuickFix にフォーカスを奪われる

watchdogs.vim で、文法エラーがあったときに QuickFix にフォーカスを奪われる - vim 初心者の作業メモ の続き.

フォーカスが奪われる現象

osyo-manga
すみません、ちょっとこの設定で試してもらえますか?
http://ideone.com/xJZIyY

http://d.hatena.ne.jp/syngan/20130125/1359120567#c1359130400
let g:quickrun_config = {
\   "watchdogs_checker/_" : {
\               "hook/copen/enable_exist_data" : 1,
\               "hook/back_window/enable_exit" : 1,
\               "hook/back_window/priority_exit" : 100,
\   },
\}
let g:quickrun_config["watchdogs_checker/hoge"] = {
\       "command"   : "hoge",
\       "exec"      : "%c %o -P %s:p",
\}
let g:quickrun_config["hoge/watchdogs_checker"] = {
\       "type" : "watchdogs_checker/hoge",
\}
http://ideone.com/xJZIyY

おしょーさんにコメント頂いた方法でフォーカス奪われなくなりました. thx. watchdogs.vim 便利.

errorformat の設定方法

こちらもlingr で教えてもらった. 感謝.

わかったこと
  • ダブルクォートは \ でエスケープする必要がある.
  • %f は isfname で指定される文字をもとに判定する.
    • :echo '"' =~# '\f' とかすると isfname に入っている文字か簡単に調べられる。
  • カンマ(,) もエスケープする必要がある

ダブルクォートが原因かと思っていたがカンマをエスケープできていないことが原因だった.
'on line 4 of "filename", error message' の形式に対応するには, 次のように指定する

let g:quickrun_config["hoge/watchdogs_checker"] = {
\   "type" : "watchdogs_checker/hoge",
\   "quickfix/errorformat"      : 'on line\ %l\ of\ \"%f\"\,\ %m',
\}
lingr ログ・ダイジェスト版

syngan: うぬぬ。これ(errorformat)は vim の機能をそのまま使ってる、でいいんですか?
manga_osyo: そうだったと思います。
manga_osyo: 気になるようであれば Vim の set errorformat に設定してみてためしてみるのもいいかなぁ。
chikatoike: エスケープする必要があるなら、set errorformatを使う場合は \"%f\" が正解かな。
thinca: errorformat はかなり鬼門ですな
manga_osyo: errorformat は1箇所でも間違っていると何も結果に反映されないのでエラーハンドリングがむずい…
syngan: 'on line %l of "%f", %m' でいいとおもってるんですが、行末までがファイル名扱いになってしまいます、だったかな?
thinca: それは不思議ですね。isfname に変な値が入っているとか?
syngan: ちがった・・・ごめんなさい
syngan: "%f" だとエラー行として反応してくれない
syngan: %f だと行末まで %f 扱いでした
syngan: \"%f\" は "%f" と同じ動作でした
chikatoike: " を使うとき、&errorformat に指定する文字列自体は \" とする必要はない。でもerrorformatに限らずsetの右辺は \" とする必要がある。これが混乱の原因。
thinca: %f は isfname オプションの設定に依存します。
thinca: isfname は「どの文字をファイル名として扱うか」を指定するオプションです。文字の集合が指定されています。
syngan: 「@,48-57,/,.,-,_,+,,,#,$,%,~,=」でした
thinca: , は入ってたか
thinca: " は入ってませんね。
thinca: :echo '"' =~# '\f' とかすると isfname に入っている文字か簡単に調べられる。
thinca: で、%f はこれらの文字の連続をファイル名としてキャプチャします。
thinca: それと、errorformat では , はパターンの区切りなので、, 自体をエスケープする必要があります。
syngan: なんと・・・
thinca: , 区切りで複数のパターンを指定できるようになってます。

http://lingr.com/room/vim/archives/2013/01/26