CakePHPで開発するVimmerにオススメの設定

はじめに

私の設定はまとめてここに置いてあります。
comeonly/spf13-vim

spf13/spf13-vimというVimディストリビューションを使っているので、インストールしたあと、spf13氏のリポジトリを私(comeonly)のものに差し替えてもらえれば同じ設定になります。

前はcarlhuda/janusを使ってたんですが、カスタマイズしにくいのと、neocomplcacheとかVundleとか新しいのを使いたかったのでやめちゃいました。

上記spf13-vimから追加したもの

世界中のVimerがtpope氏の恩恵を受けてるはず。今見たら4つもプラグイン入れてるわ。。。今回の記事とは関係ないですが便利なプラグインです。

後述しますが、phpとhtmlがまざってても綺麗にインデントします。forkしてCakePHP用にタブの設定を弄りました。

CakePHPのコーディング規約をPHP_CodeSnifferでチェック、Syntasticで該当箇所を表示

綺麗なコードってどうやって書くんだろう・・・謎でした。コーディング規約ってのがあるらしいんですよ。

CakePHP 2.3 の新機能 ServerShell の話 - Shin x blog
この記事読んで、コーディング規約って大事なんだなぁと思って、なんとかSyntasticで表示してくれないかなぁってのが実はきっかけであります。

必要なもの

  1. PEAR
  2. PHP_CodeSniffer
  3. scrooloose/syntastic

ここまでの設定は以下が詳しいです。とてもわかりやすく参考になりました。この場を借りて御礼申し上げます。
Vim初心者によるVim導入記録(CodeSnifferインストール+シンタックスチェック syntastic設定編) | Code Life




さて、ではここまででsyntasticでエラーが表示できるようになっているかと思います。
ここからがCakePHP用の設定。

方法は2つ。

1) PHP_CodeSniffer側の設定を変更する
デフォルトの規約をCakePHPに設定します。ちなみにインストール時はPEARの規約が設定されているそうです。

$ phpcs --config-set default_standard CakePHP

これだけ。

2) syntastic側の設定を変更する
syntasticがphpcsを呼ぶ時の引数に --satandard=CakePHP を指定します。

let g:syntastic_php_phpcs_args = '--report=csv --standard=CakePHP'

以上


HTMLの混ざったctpファイルでも綺麗なインデントをさせる

CakePHPで開発しててctpファイルが見にくいことがあるんです。そもそもphpをガリガリ書いちゃダメなんだろうなぁ、わからんけど。
なんにせよ、インデントが残念でイライラする。どうにかしたい。。。

相変わらずstackoverflow.com最高です。

After looking really really hard into all solutions, I found out this plugin:

http://www.vim.org/scripts/script.php?script_id=604

It seems to have solved my problems!!!!!

Correct indentation of HTML and PHP using Vim - Stack Overflow

この記事にありました。
Vundleが入っていれば

Bundle 'php.vim-html-enhanced'

でOK。

ただ、この設定だとshiftwidth=3という誰得設定。。。
それからCakePHPの規約はハードタブなのでその3点だけ変更したのがこちら。

Bundle 'comeonly/php.vim-html-enhanced'

g=G で快適。


PHP全般で便利な関数

ここで見かけたやつです。

PHP: ブロックオブジェクト
vim組み込みのオブジェクトに似たもの
aP - PHPブロック(タグを含む)
iP - PHPブロック内部のテキスト

vaP - 現在のPHPブロックをタグを含んで選択する
ciP - 現在のPHPブロック内のテキストを変更する
yaP - 現在のPHPブロックをタグを含んでコピーする
自分の.vim/ftplugin/php.vimの中で提供してる

(PHP)プログラマのためのVIM (9) - PHP向けカスタマイズ - おぎろぐはてな

その提供してるってのがこれ。

" Function to locate endpoints of a PHP block {{{
function! PhpBlockSelect(mode)
    let motion = "v"
    let line = getline(".")
    let pos = col(".")-1
    let end = col("$")-1

    if a:mode == 1
        if line[pos] == '?' && pos+1 < end && line[pos+1] == '>'
            let motion .= "l"
        elseif line[pos] == '>' && pos > 1 && line[pos-1] == '?'
            " do nothing
        else
            let motion .= "/?>/e\<CR>"
        endif
        let motion .= "o"
        if end > 0
            let motion .= "l"
        endif
        let motion .= "?<\\?php\\>\<CR>"
    else
        if line[pos] == '?' && pos+1 < end && line[pos+1] == '>'
            " do nothing
        elseif line[pos] == '>' && pos > 1 && line[pos-1] == '?'
            let motion .= "h?\\S\<CR>""
        else
            let motion .= "/?>/;?\\S\<CR>"
        endif
        let motion .= "o?<\\?php\\>\<CR>4l/\\S\<CR>"
    endif

    return motion
endfunction
" }}}

" Mappings to select full/inner PHP block
nmap <silent> <expr> vaP PhpBlockSelect(1)
nmap <silent> <expr> viP PhpBlockSelect(0)
" Mappings for operator mode to work on full/inner PHP block
omap <silent> aP :silent normal vaP<CR>
omap <silent> iP :silent normal viP<CR>

vim-settings/.vim/ftplugin/php.vim at master · andreiz/vim-settings · GitHub

要らないかなーとか思ってたんですが、リファクタリングする時はかなり便利かも。