QuickRun.vim 実行前に定義した関数を実行するプラグインを作った

id:thinca さん作の QuickRun.vim は自分がコードを書く上で書かせないプラグインの一つでとても重宝している。
テストコードでもテストランナーを実行してくれるのが嬉しい。


ただ、毎回毎回開いているテストコードのテストを全て実行して欲しくない時もある。
たとえばガリガリ開発している時は毎回毎回全てのテストが実行される必要はない。
取りかかっているテストのメソッドのみを実行したい。
# テストを素早く実行できるのは大事なんじゃないかと思う。


Python の場合、nose を使用すれば特定のメソッドのコードを実行するというのが可能。

nosetests /path/to/test/file.py:test_function

Basic usage — nose 1.3.7 documentation

ということで QuickRun 実行時にこれを渡してやれば行けそう。


Vim でテストコードを開いていて、メソッド名が test_ で始まるものを探せば実行するメソッドは取れる。
クラス名は現在行から上に class Test で始まる行を取得すれば取れる。
で、g:quickrun_config のオプションに設定してやれば行けそう。
問題はどうやって QuickRun 実行時に g:quickrun_config にこれを設定してやるのかがわからなった。


QuickRun のマニュアルを読んで、実行を一番最初に受け取るメソッド以降を少しだけ読んでみたが、フックは出来なさそう。
折角 QuickRun という素晴らしい実行インタフェースがあるので、安易に system('nosetests') とかで実行するより、QuickRun の機能を使いたい。


実行前に g:quickrun_config を書き換えられれば良いので、自分で定義した関数で設定を動的に書き換えて、quickrun#command() を実行してやれば良いんじゃないかと思った。
で、どうせならと思い簡単なプラグインを作った。
https://github.com/heavenshell/vim-unitquickrun


自分の QuickRun 関連の設定は以下の通り

augroup QuickRunUnitTest
  autocmd!
  autocmd BufWinEnter,BufNewFile *test.php setlocal filetype=php.unit
  autocmd BufWinEnter,BufNewFile test_*.py setlocal filetype=python.unit
  autocmd BufWinEnter,BufNewFile *.t setlocal filetype=perl.unit
augroup END
let g:quickrun_config = {}
let g:quickrun_config['php.unit'] = {'command': 'phpunitrunner'}
let g:quickrun_config['python.unit'] = {'command': 'nosetests', 'cmdopt': '-s -vv'}
let g:quickrun_config['perl.unit'] = {'command': 'prove'}
let g:quickrun_config['rst'] = {'command': 'sphinx-build', 'cmdopt': '-b html -d ..build/doctrees ../source ../build'}

ここで、test_* で始まる Python コードは python.unit として定義しているので、ファイルタイプ*1ごとにautoload/unitquicrun/ にファイルを作り実行できるようにした。
呼び出しのオプションは基本的に QuickRun と同じ。
デフォルトでは u に割り当てている。

nnoremap <silent> ,r :UnitQuickRun -mode n -runner vimproc:100<CR>

とかで変更できる。


作ったファイル内で g:quickrun_config を書き換えて、quickrun#command() を呼び出したら意図通りに動いた。
毎回動的に処理をするので速度は遅くなっているが、全てのテストを実行するよりは速い。


Python だけじゃなくて PHP でも Stagehand_TestRunner を使えば同様にメソッドだけテストが出来るのでこれを使えばできそう。
またテストだけでなくて、たとえば Sphinx で reST なファイルをコンパイルする際に source と dest の位置を書き換えるとかも出来る。


こんな手間の掛かる事をしなくても QuickRun 本体で出来るのかもしれない。
まぁ自分専用なつもりで書いたので、いいかなーと。
例によって Vim Script はこれでええのかなーと思って書いた。
あとドキュメントは書いてないので ToDo としている。


追記(1/22)

との事なので、QuickRun 0.6 が正式にリリースされたら、このプラグインは用なしになります。
楽しみ!

*1:ただし "."は消すようにした