実装(プロダクト)コードとテストコードを行き来する

概要

IDEの便利な機能の一つとして、実装コードとテストコードの行き来があります。
Eclipseでいえば、例えばQuick JUnit Plugin for Eclipseです。
またEclipseで言えば実装ファイルからテストファイルを作成したり、その逆が出来たりします。
こういった作業の簡略化がTDDなどのしやすさにも繋がります。

これはかなり便利です。逆に言えばこれがないと不便です。
Javaの場合はEclipseを使うのでいいのですが、PHPをいじるときはVimです。PHPをいじるときはVimです。
Vimでも同じ事が出来るようにカスタマイズしましょう。
プラグインですでにあるのかもしれませんが、勉強のために自分で書いてみることにします。

結論

以下のコードを.vimrcに記述します。
命名規則(src/mainとかテストファイルのサフィックスがTestとか)が異なる場合は修正してください。

" @see http://vim-users.jp/2011/02/hack202/
" 保存時に対象ディレクトリが存在しなければ作成する(作成有無は確認できる)
augroup vimrc-auto-mkdir
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
  function! s:auto_mkdir(dir, force)
    if !isdirectory(a:dir) && (a:force ||
    \    input(printf('"%s" does not exist. Create? [y/N]', a:dir)) =~? '^y\%[es]$')
      call mkdir(a:dir, 'p')
    endif
  endfunction 
augroup END

" 実装コードとテストコードを切り替える
function! SwitchCode()
  let name = expand('%:t:r')
  if matchend(name, 'Test') == strlen(name)
    let path = expand('%:s?src/test?src/main?:s?Test??:p')
  else
    let path = expand('%:s?src/main?src/test?:r') . 'Test.'. expand('%:e')
  endif
  execute ':e ' . path
endfunction
nnoremap <silent> <Space>z :call SwitchCode()<CR>

動作確認

次のようなプロジェクト構成の場合

project
└── src
    ├── main
    │   └── foo
    │       └── hello.php
    └── test
        └── foo
            └── helloTest.php
  • hello.phpを開いている状態で→ z →helloTest.phpを開く
  • helloTest.phpを開いている状態で→ z →hello.phpを開く
  • 書き込み時にディレクトリが存在しない場合は作成有無を確認する

注意と課題

  • 実用的?
    • まだ現場のソースコードで試していないので実用的なものかは分からない
    • MVCの命名規則に合わせた移動(rails.vimみたいな)も出来そうだけど、このままじゃ出来ない
  • ソースが汚い
    • expandしすぎ。SwitchCodeの引数に%:pもらって正規表現で置換した方がいいかも?
    • サフィックスがベタ書き
    • バッファ開くのは execute ':e' でいいんだろうか。何か関数ありそうな気もするけれど。。


初めてオレオレスクリプト書いた!楽しい!