RubyでTDDをやる際に、ちょっと便利になるVimの設定

先日のTDDBC繋がりで、Vimネタを一つ。


Railsを書く時は、rails.vimRSpecシンタックスハイライトや、
関連ファイル間の移動を面倒見てくれますが、
Railsの世界から出ると(ディレクトリ構成、命名規則が変わると)
rails.vimが使えなくなるため、そのあたりの機能が動いてくれなくなります。


なので、素のRubyコードを書く時や、
Sinatraなどをもっとシンプルなディレクトリ構成で開発している時に、
RSpecシンタックスハイライトを行う設定と、
実装とSpecを手早く切り替えるためのプラグインを紹介します。

RSpecシンタックスハイライト

rails.vimではautoload/rails.vimの中で呼ばれている、
シンタックスハイライトを実現している部分から、
RSpecに関係する所だけ設定を持ってきて、vimrcに書いてしまえばシンタックスハイライトが出来ます。
ただし、そうそう変更になる部分では無いと思いますが、
rails.vimで大きく変更されるようなことがあれば、設定が干渉する可能性があります。

function! RSpecSyntax()
  hi def link rubyRailsTestMethod             Function
  syn keyword rubyRailsTestMethod describe context it its specify shared_examples_for it_should_behave_like before after around subject fixtures controller_name helper_name
  syn match rubyRailsTestMethod '\<let\>!\='
  syn keyword rubyRailsTestMethod violated pending expect double mock mock_model stub_model
  syn match rubyRailsTestMethod '\.\@<!\<stub\>!\@!'
endfunction
autocmd BufReadPost *_spec.rb call RSpecSyntax()


RSpec用のシンタックスハイライト設定を関数にまとめて、
BufReadPost(ファイルが読み込まれた時に発生するイベント)をトリガーに関数を実行する。
Specファイルの命名パターンが違う場合は、適宜修正してください。
もしかしたら、ハイライトの定義名を、rails.vimから変えておいた方が良いかもしれない。

Specファイルと実装コードの切り替え

vim-altrというプラグインを利用します。
https://github.com/kana/vim-altr


vim-altrは、関連するファイルのパターンを定義しておけば、
ワンタッチで、関連ファイルを順番に切り替えることが出来るプラグインです。


以下のように定義しておきます。

nmap <F3> <Plug>(altr-forward)
nmap <F2> <Plug>(altr-back)

" For ruby tdd
call altr#define('%.rb', 'spec/%_spec.rb')
" For rails tdd
call altr#define('app/models/%.rb', 'spec/models/%_spec.rb', 'spec/factories/%s.rb')
call altr#define('app/controllers/%.rb', 'spec/controllers/%_spec.rb')
call altr#define('app/helpers/%.rb', 'spec/helpers/%_spec.rb')


vim-altrのdocを見れば書かれていますが、
%は、0文字以上の文字列にマッチし、
もう一方の%部分をマッチ箇所と置き換えたファイルと関連付けられます。
この設定にはありませんが、*も使えます。
こちらは0文字以上のマッチは一緒ですが、
もう一方のファイル側もマッチした文字列に束縛されず何にでもマッチします。


上記設定で、sample.rbというファイルを編集している時に、
spec/sample_spec.rbが存在していれば、で切り替えが可能です。
また、altrの定義はループするため、端まで辿りつけば、最初の関連ファイルに戻ります。


切り替えのためのマッピングは、適宜置き換えてください。
自分ごのみのディレクトリ構成がある場合は、
それに合わせて定義を追加することで、自在に切り替え可能です。


注意点が一つ。
同一のパターンを複数の定義で利用するような設定をすると、
定義が干渉して、切り替えが上手く動作しない場合があります。




TDDにはリズムが大事。
レッド、グリーン、リファクタリングのサイクルを素早く回すために、
環境を整えておきましょう。



おまけ

メジャーなgemではありますが、guardというgemを利用すると、
ファイルの変更を検知して、様々なコマンドを呼びだすことが出来ます。
guard-rspecを使うと、実装コード、Specファイルを編集した時に、
自動でRSpecをキックしてくれて、Growlに結果を通知するといったことが可能です。
昔からautotest系のツールはありましたが、
今、一番使いやすいのはguardだと思っています。
もしテストの自動実行に興味があるなら是非使ってみてください。

gem install guard-rspec
guard init rspec
# -> Generate Guardfile

guard start


Guardfileの中身はDSLっぽくなっていて、簡単に設定可能です。