cake.vimで複数のCakePHPプロジェクト間を移動する

複数のCakePHPを平行開発している時の悩み

cake.vimを使っていて、いくつものCakePHP製のWebアプリケーションを平行して開発していると、
瞬時に別のプロジェクトに移りたいなーというときが良くありました。

cake.vimでは次のようにCakephpコマンドの引数にappディレクトリのパスを指定すればプロジェクトの切り替えができます。

:Cakphp {appディレクトリへのパス}


でも、いちいちパスを打つのも面倒です。タブを押すとディレクトリ名の補完が聞くとはいえ、
頻繁に切り替えるとなるとなんだかなーと思っていました。

切り替え用コマンド

そこで、.vimrcに次のような切り替え用コマンドを書いてみたらわりと便利でした。
やっていることは単純で、辞書(PHP連想配列のような値)形式でプロジェクト名とプロジェクトのフルパスを持っておき、
プロジェクト名の指定で切り替えているだけです。

" プロジェクト切り替えコマンド
command! -n=1  -complete=customlist,s:GetCakePHPProjectList C :call s:SetCakePHPProject(<f-args>)
function! s:GetCakePHPProjectList(ArgLead, CmdLine, CursorPos) "{{{
  if exists("g:my_cakephp_projects") && len(g:my_cakephp_projects)
    return filter(sort(keys(g:my_cakephp_projects)), 'v:val =~ "^'. fnameescape(a:ArgLead) . '"')
  else
    return []
  endif

endfunction "}}}

" プロジェクト切り替え
function! s:SetCakePHPProject(app) " {{{
  if isdirectory(g:my_cakephp_projects[a:app])
    silent exec ":Cakephp " . g:my_cakephp_projects[a:app]
    echo "CakePHP project changed: ". a:app
  endif
endfunction " }}}
使い方

まず、g:my_cakephp_projectsという辞書名で、プロジェクト名 : プロジェクトパスの情報を
.vimrcとかに書いておきます。

let g:my_cakephp_projects = {
 \ 'hoge_project' : '/path/to/app1',
 \ 'fuga_project' : '/path/to/app2',
 \ }


ノーマルモードで:Cと入力した後にプロジェクト名を指定します。タブを押すと補完できます。

:C hoge_project


:Cは短すぎる!という場合には以下の場所を変更すればオッケーです。(コマンド名をCprojectに変更した例)

command! -n=1  -complete=customlist,s:GetCakePHPProjectList Cproject :call s:SetCakePHPProject(<f-args>)

プロジェクトのパスを記述する場所を変更する

.vimrcはGithubで管理しているからプロジェクトのパスは書きたくないよ!という場合には
g:my_cakephp_projectの設定だけGithubに入れていないファイルに書いて、.vimrcから読み込むとよいです。

その場合、thincaさんのhttps://github.com/thinca/vim-localrcがとても便利です。

vi ~/.local.vimrc

で作ったファイルに設定を書いておき、.vimrcから次のように読みこみます。

silent! call localrc#load('.local.vimrc', $HOME)


これでCakePHPのプロジェクト間の移動も少し楽になりましたー。