rspecをvim-quickrunから非同期で実行する

quickrunはデフォルトでいろんなファイルを実行してくれますが、rspecまではカバーしてくれていないので、
hogehoge_spec.rb等のファイルを開いて、quickrunすると普通にrubyコマンドで実行されてしまいます。


ソースコード自体でrspecライブラリをrequireしていれば、それでも動作するはずですが、
普通はrspecコマンドから実行することを想定しているので、
余計なrequire記述はしていないと思います。


なので、vimrcにちょこっと設定を追加して、
rでサクっとrspecコマンドから実行できるようにします。

let g:quickrun_config = {}
let g:quickrun_config._ = {'runner' : 'vimproc'}
let g:quickrun_config['rspec/bundle'] = {
  \ 'type': 'rspec/bundle',
  \ 'command': 'rspec',
  \ 'exec': 'bundle exec %c %s'
  \}
let g:quickrun_config['rspec/normal'] = {
  \ 'type': 'rspec/normal',
  \ 'command': 'rspec',
  \ 'exec': '%c %s'
  \}
function! RSpecQuickrun()
  let b:quickrun_config = {'type' : 'rspec/bundle'}
endfunction
autocmd BufReadPost *_spec.rb call RSpecQuickrun()


簡単な説明

  1. g:quickrun_configにrspecのコマンドを実行するタイプを追加します。
  2. autocmdで*_spec.rbを読みこんだ時は、b:quickrun_configを設定して、そのバッファでquickrunを実行する際のtypeを上書きします。
  3. runnerにvimprocを利用することで、rspecの起動待ち、実行中でもvimがロックされずに済む。


RailsSinatraで使うことを想定しているので、bundlerベースの起動をデフォルトにしていますが、
bundlerを使ってない場合は、b:quickrun_configを設定しなおすか、
:QuickRun rspec/normalといった形で呼出タイプを指定するといいかと思います。
読み込んだ時のカレントディレクトリにGemfileが存在するかどうかで、自動で分けるとかも可能だと思いますが、
めんどいのでやってません。


後は、出力を上手くハイライトしてRed-Greenが分かるようにしたいけど、かなり面倒そうな気が・・・。


書いてから思ったけど、これRuby Advent Calendarのネタになったんじゃ・・・。
自分から、ネタ一個潰して自爆してないか。(汗