tmuxとvim-rspecとvim-dispatchで快適なRSpec生活

  • 76
    Like
  • 5
    Comment
More than 1 year has passed since last update.

tmuxと

この2つを組み合わせて使うとvimからRSpecで書いたexampleを実行するのが超楽になります

とりあえず新しいプラグインを見つけた時に一番最初に気になる「NANIができんねん!??!?!?!」

というのは言葉ではなく実際に見てみないとわからないのでgifを貼ります

といった具合に

  • RSpecをvimから実行出来る
  • 実行処理は™uxの別paneが自動的に開いてそこで
  • 実行後vimのquickfixで結果を表示

してくれます。個人的には痒いところに手が届く感じがしてすごいいいです。

もちろんカーソルから一番近いexample1個だけを実行も出来ます

何が起こったかの流れ

vim-rspecを入れることによって実行できる

:call RunCurrentSpecFile()
:call RunNearestSpec()
:call RunLastSpec()
:call RunAllSpecs()

のコマンドの内どれかを実行

vim-rspec側の設定でvim-dispatchを入れることによって入るDispatchコマンドにrspecコマンドを渡して実行

vim-dispatchはtmuxが起動してると自動的に別paneを開いて実行してくれる

vim-dispatchが実行結果をquickfix上で表示してくれる

といった感じになります。

設定方法

インストール

NeoBundle 'tpope/vim-dispatch'
NeoBundle 'thoughtbot/vim-rspec'

僕のように遅延ロードして少しでもvim起動を速くしたい人は

NeoBundleLazy 'thoughtbot/vim-rspec', {
                \ 'depends'  : 'tpope/vim-dispatch',
                \ 'autoload' : { 'filetypes' : ['ruby'] }
              \ }

設定

let g:rspec_command = "Dispatch rspec {spec}"

とすることによってvim-rspecによって入るコマンドを叩いたらrspecコマンドをDispatchコマンドに渡して実行できます。

NeoBundleLazyを使用してる方は

let s:bundle = neobundle#get('vim-rspec')
function! s:bundle.hooks.on_source(bundle)
   let g:rspec_command = 'Dispatch rspec {spec}'
endfunction

になります。

ちなみに僕はRSpec 1.Xを使用してるプロジェクトもあるので

let s:bundle = neobundle#get('vim-rspec')
function! s:bundle.hooks.on_source(bundle)
  if executable('rspec')
    let g:rspec_command = 'Dispatch rspec {spec}'
  elseif executable('spec')
    let g:rspec_command = 'Dispatch spec {spec}'
  endif
endfunction

としてます。

おまけ

zeusも使ってる人は

let g:rspec_command = "Dispatch zeus rspec {spec}"

とすればzeusの恩恵ももちろん受けれます、便利!

キーバインド

僕は以下のように設定してます

nmap <silent><leader>c :call RunCurrentSpecFile()<CR>
nmap <silent><leader>n :call RunNearestSpec()<CR>
nmap <silent><leader>l :call RunLastSpec()<CR>
nmap <silent><leader>a :call RunAllSpecs()<CR>

まとめ

guardも使用してるんですが、guardでは個別のexampleを実行するいい方法が見つからず、この方法に行き着きました。

vim-dispatchはvim-rspecと組み合わせて使う以外にも色々と便利な使い道があるので一度READMEをみてみるといいかもしれません