quickrun.vimでRSpecの実行結果のカラー設定をする

Rails少し勉強してTDDとはなんぞや、テストってなんぞやと思ったのでRailsのテストでよく使われているらしいRSpecを勉強してる。
The RSpec BookはRSpecのみならずTDD(BDD)についても分かりやすく書いてあると評判だったので買ってみて写経を開始。

Vimでコードを書いていてふとRSpec関連で良いプラグインないかなーって思ってググッたけど特に見つからず。そのかわりquickrun.vimでRSpecの実行結果を見れるようにするという記事をいくつか発見。

動くのは動くんだけど色設定が反映されない。全部試したけどうまくいかない。.vimrcに設定を書くやり方は試行錯誤して諦めた(ちなみにVimはMacVimKaoriYa)。syntax用のファイルを作ることにしたけどquickrun.vimを編集するのもなぁ、と思っていろいろ調べていたらquickrun.vimは専用のsyntaxファイル(~/.vim/syntax/quickrun.vim)を作ったら勝手に読み込んでくれるという記事を発見した。

上記の記事を参考に設定したらすんなり色分けされた。quickrun-rspec

しかしこのままだとoutputされるsyntaxがquickrun(デフォルト)となってしまうため、どのプログラムを実行しようが出力先の色設定は.vim/syntax/quickrun.vimが読み込まれてしまう。
やはり記事のようにquickrun.vimをカスタマイズするしかないのかと思いきや、quickrun.vimの最新のアップデートで出力先のファイルタイプを指定できるようになったみたいだ。(https://gist.github.com/2802244

そこでRSpecの実行結果用syntaxファイルを書いて(~/.vim/syntax/rspec-result.vim)、quickrun.vimでRSpecを実行したときはそのsyntaxファイルを読み込むように’outputter/buffer/filetype’の設定を’rspec-result’とした。

以下コード(.vimrc, .vim/syntax/rspec-result.vim)

[code]
" .vimrc

"
" RSpecとquickrunの設定
"
"quickrunの前設定を初期化する。
let g:quickrun_config = {}

augroup QrunRSpec
autocmd!
autocmd BufWinEnter,BufNewFile *_spec.rb set filetype=ruby.rspec
augroup END

"quickrunの動作をvimprocに指定する。
" let g:quickrun_config._ = {‘runner’ : ‘vimproc’}

" bundleを利用する設定。
let g:quickrun_config[‘rspec/bundle’] = {
\ ‘type’: ‘rspec/bundle’,
\ ‘command’: ‘rspec’,
\ ‘exec’: ‘bundle exec %c %s’,
\ ‘outputter/buffer/filetype’: ‘rspec-result’,
\ ‘split’: ”
\}

" 通常で利用する設定。
let g:quickrun_config[‘rspec/normal’] = {
\ ‘type’: ‘rspec/normal’,
\ ‘command’: ‘rspec’,
\ ‘exec’: ‘%c %s’,
\ ‘outputter/buffer/filetype’: ‘rspec-result’,
\ ‘vsplit’: ”
\}

"※ここで動作を変更する
"どの場面で使うか(rubyかrailsか)によってコマンドが変わるので
"手動でコメントアウトをつけたり外したりして利用している。
function! RSpecQuickrun()
" 通常の場合。(rubyなど)
let b:quickrun_config = {‘type’ : ‘rspec/normal’}
" bundle、Gemfileを利用している場合。(railsなど)
" let b:quickrun_config = {‘type’ : ‘rspec/bundle’}
endfunction

autocmd BufReadPost *_spec.rb call RSpecQuickrun()
[/code]
[code]
" .vim/syntax/rspec-result.vim

if exists("b:current_syntax")
finish
endif

if !exists("main_syntax")
let main_syntax = ‘rspec-result’
endif

"大文字と小文字を区別する
syntax case match

syntax match RSpecGreen /^[\.F]*\.[\.F]*$/
syntax match RSpecGreen /^.*, 0 failures$/
syntax match RSpecRed /F/
syntax match RSpecRed /^.*, [1-9]* failures.*$/
syntax match RSpecRed /^.*, 1 failure.*$/
syntax match RSpecRed /^ *(.*$/
syntax match RSpecRed /^ *expected.*$/
syntax match RSpecRed /^ *got.*$/
syntax match RSpecRed /^ *Failure\/Error:.*$/
syntax match RSpecRed /^.*(FAILED – [0-9]*)$/
syntax match RSpecRed /^rspec .*:.*$/
syntax match RSpecComment / # .*$/
syntax match RSpecNormal /^Failures:/
syntax match RSpecNormal /^Finished/
syntax match RSpecNormal /^Failed/

" 背景色ver.
" highlight RSpecGreen ctermfg=White ctermbg=Green guifg=White guibg=Green
" highlight RSpecRed ctermfg=White ctermbg=Red guifg=White guibg=Red
" highlight RSpecComment ctermfg=White ctermbg=Cyan guifg=White guibg=Cyan
" highlight RSpecNormal ctermfg=Black ctermbg=White guifg=Black guibg=White

" 文字色ver.(※ただしMacVimKaoriYaだとうまく動かなかった)
" highlight RSpecGreen ctermfg=Green ctermbg=none guifg=Green guibg=none
" highlight RSpecRed ctermfg=Red ctermbg=none guifg=Red guibg=none
" highlight RSpecComment ctermfg=Cyan ctermbg=none guifg=Cyan guibg=none
" highlight RSpecNormal ctermfg=White ctermbg=none guifg=Black guibg=White

" 文字色ver.(noneのとこ消したらうまくいった)
highlight RSpecGreen ctermfg=Green guifg=Green
highlight RSpecRed ctermfg=Red guifg=Red
highlight RSpecComment ctermfg=Cyan guifg=Cyan
highlight RSpecNormal ctermfg=White guifg=Black guibg=White

let b:current_syntax = ‘rspec-result’

if main_syntax == ‘rspec-result’
unlet main_syntax
endif
[/code]

これで快適に写経進められる。

LINEで送る
Pocket