読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【vim】vimprocを使ってvim-quickrunからRspecを非同期実行!

ruby tool

テスト、書いてますか?
私は… すこしづつ慣れてきているところでしょうか。


ruby(Rails)で開発をする際、ユニットテストRSpecを利用している方多いですよね。
Vimを使っている方ならおなじみの「quickrun」を私も利用して
vim上からテストを実行しているのですが、
普通にquickrunからテスト実行すると、実行中はvimの操作ができなくなっちゃうんですよね…

で、検索してみると
「vimproc」なるものを使用すると別プロセスでquickrunを実行できるらしい。

というわけで環境整えてみました。


vim-quickrunの導入

Vim上から編集中のプログラムを実行してくれるスグレモノです。

↓ここからダウンロード↓
https://github.com/thinca/vim-quickrun/tags

解凍したら、~/.vim/pluginの中に突っ込むだけでOK


※Vundleでパッケージを管理している人
  → .vimrcに下記を追加してBundleInstallを実行しましょう

Bundle 'thinca/vim-quickrun'


.vimrcを読み込み直してRubyファイルをvimで開き、\rを押すと現在開いているファイルを実行してくれます!
もちろんRubyだけでなく、CやPHPやいろんな言語に対応しているみたいです。
(拡張子で判断してくれてるのかな?)


ただ、このままではRSpecファイルを自動で実行してはくれません。
.vimrcに以下を追加しましょう。

"RSpec対応
let g:quickrun_config = {}
let g:quickrun_config['ruby.rspec'] = {'command': "rspec"}
augroup RSpec
  autocmd!
  autocmd BufWinEnter,BufNewFile *_spec.rb set filetype=ruby.rspec
augroup END 


Railsにおいてgemをbundlerでvender/bundleなどのディレクトリに一括管理している場合、
RSpec実行を「bundle exec rspec」のようにおこなうと思いますが、その場合は
上記の「let g:quickrun_config['ruby.rspec'] = {'command': "rspec"}」の行を
以下のようにに書き換えたりして対応しています。
(私はこのように記述しているのですが、もっと良い書き方あるのかな?)

let g:quickrun_config['ruby.rspec'] = { 'command': 'rspec', 'cmdopt': 'bundle exec', 'exec': '%o %c %s' }


.vimrcを読み込み直し、specファイルを開いて\rで実行してみてください。
テスト動きましたか??


vimprocを利用する

quickrunを設定してテストを実行すると、テスト実行中はVimが固まってしまうことがわかります。
これ長めのテスト実行したときは結構鬱陶しいんですよね…

というわけで、vimprocを使って別プロセス?でテストを実行してくれるようにします。

〜参考にさせて頂きました!!〜
rspecをvim-quickrunから非同期で実行する - joker1007の日記

インストール

Vimのプラグインですので、
https://github.com/Shougo/vimproc/downloads
(Windowsとそれ以外でパッケージが分かれてる?ようです)
からダウンロード、解凍して~/.vim/plugin/に置けばいいのですが、
コンパイルが必要です。

と言っても難しいことはなく、解凍したディレクトリに移動して以下のコマンドを実行するだけです。

$ make -f make_unix.mak

※これはLinuxの場合ですが、各OSによって実行するmakefileが違います。
doc/vimproc.txtに書いてあるのでご参照ください。

※Vundleでパッケージを管理している人
  → .vimrcに下記を追加してBundleInstallを実行しましょう

Bundle 'git://github.com/Shougo/vimproc'

ただしコンパイルされていない状態ですのでお気をつけて!
コンパイルまで自動化されてる方もいらっしゃるようですので参考にされてみてはどうでしょう。

〜参考になりました!〜
vundle, pathogen更新時にvimprocをコンパイルする - とりあえず勉強用の日記


最後に、quickrunの設定にvimprocで実行してくれるよう付け加えます。

let g:quickrun_config._ = {'runner' : 'vimproc'}

結果、私の.vimrc内のquickrun設定はこんなんなってます。

"RSpec対応
let g:quickrun_config = {}
let g:quickrun_config._ = {'runner' : 'vimproc'}
let g:quickrun_config['ruby.rspec'] = { 'command': 'rspec', 'cmdopt': 'bundle exec', 'exec': '%o %c %s' }
augroup RSpec
  autocmd!
  autocmd BufWinEnter,BufNewFile *_spec.rb set filetype=ruby.rspec
augroup END

また.vimrcを読み込み直し、RSpecを実行すると、
実行中もVimが使用できるようになってませんか??


別プロセスでテストが実行できたなら設定完了です!!
楽しいRSpecライフをお送り下さい☆