これまで僕の環境でテストを実行しようと思ったら、Perlであれば
TEST_METHOD=hoge carton exec prove t/path/to/test.t
みたいなコマンドをいちいち打つ必要があって、これは人間がやることではないという状態が続いていた。
さすがに我慢できんということでIRCチャンネルで相談してみたところ、id:motemen さんの助けによってある程度この問題を解決できた。
結論から先に書くと、先ず dotfiles/.vim/after/ftplugin/perl.vim at 4f5cb0d98fc7cd9cf590e7d70a1814b9019165b8 · motemen/dotfiles をパクり改変して、
function! s:test_class_test_method() let re = 'sub\s\+\(\S\+\)\s*:\s*Test' let line = search(re, 'bn') if line let res = matchlist(getline(line), re) let $TEST_METHOD=res[1] make let $TEST_METHOD='' return endif endfunction nmap <unique> <silent> ,t :update<Enter>:call <SID>test_class_test_method()<CR>
みたいな設定を書くことによって,t
で環境変数TEST_METHODにカーソル位置から直近のテストメソッド名を設定した上で:makeを呼び出すようにする。
次に、
set makeprg=carton\ exec\ prove\ -lv\ %
みたいな設定を書くことによって、:makeで任意のコマンドを呼び出すようにする。
最後に、
set errorformat=not\ ok\ %n\ -\ %m\ at\ %f\ line\ %l%.%# set errorformat+=not\ ok\ %n\ -\ L%l:\ %m set errorformat+=not\ ok\ %n\ -\ %m
みたいな設定を書くことによって、:makeの出力からエラー行をパースできるようにする。
これらの設定をすることで、とりあえず,t
とコマンドをタイプするだけで現在のカーソル位置にあるTEST_METHODを実行できるようになった。
テストが落ちると、問題の箇所を自動で開いてくれる。
こうやって書くと何だか壮大な感じがしないでもないが、実際はVimのQuickFixという仕組みに乗っかってるだけなので、詳しくはそちらをご参照下さい。
ところで冒頭で「ある程度」と書いたのは先述のerrorformatが不完全だからで、エラーを取り逃がすことは無いものもエラーメッセージによっては問題の箇所を上手く認識させられない。
errorformatは見ての通り正規表現ですらない謎のフォーマットで書く必要があって、これが正直非常に辛い。 TAPをちゃんとパースできる設定がどっかに転がってれば良かったんだけど、検索してみた限り僕では見つけることができなかった。
そんなわけでTAPをパースできる秘伝のerrorformatをお持ちの方はぜひ御シェアのほどよろしくお願いいたします。 この辺り例えばSublimeTextだとうまくいくとかあるんすかね。