(続)watchdogs.vim で、文法エラーがあったときに QuickFix にフォーカスを奪われる
watchdogs.vim で、文法エラーがあったときに QuickFix にフォーカスを奪われる - vim 初心者の作業メモ の続き.
フォーカスが奪われる現象
osyo-manga
http://d.hatena.ne.jp/syngan/20130125/1359120567#c1359130400
すみません、ちょっとこの設定で試してもらえますか?
http://ideone.com/xJZIyY
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 の機能をそのまま使ってる、でいいんですか?
http://lingr.com/room/vim/archives/2013/01/26
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: , 区切りで複数のパターンを指定できるようになってます。