下林明正のブログ

個人的かつ雑多なブログです。

Vimからワンステップで特定のテストメソッドを呼ぶ方法

Vim

Vim

  • Machine Head
  • Rock
  • ¥200

これまで僕の環境でテストを実行しようと思ったら、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を実行できるようになった。 テストが落ちると、問題の箇所を自動で開いてくれる。

こうやって書くと何だか壮大な感じがしないでもないが、実際はVimQuickFixという仕組みに乗っかってるだけなので、詳しくはそちらをご参照下さい。


ところで冒頭で「ある程度」と書いたのは先述のerrorformatが不完全だからで、エラーを取り逃がすことは無いものもエラーメッセージによっては問題の箇所を上手く認識させられない。

errorformatは見ての通り正規表現ですらない謎のフォーマットで書く必要があって、これが正直非常に辛い。 TAPをちゃんとパースできる設定がどっかに転がってれば良かったんだけど、検索してみた限り僕では見つけることができなかった。

そんなわけでTAPをパースできる秘伝のerrorformatをお持ちの方はぜひ御シェアのほどよろしくお願いいたします。 この辺り例えばSublimeTextだとうまくいくとかあるんすかね。