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で表示してくれないかなぁってのが実はきっかけであります。
必要なもの
ここまでの設定は以下が詳しいです。とてもわかりやすく参考になりました。この場を借りて御礼申し上げます。
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: ブロックオブジェクト
(PHP)プログラマのためのVIM (9) - PHP向けカスタマイズ - おぎろぐはてな
vim組み込みのオブジェクトに似たもの
aP - PHPブロック(タグを含む)
iP - PHPブロック内部のテキスト
例
vaP - 現在のPHPブロックをタグを含んで選択する
ciP - 現在のPHPブロック内のテキストを変更する
yaP - 現在のPHPブロックをタグを含んでコピーする
自分の.vim/ftplugin/php.vimの中で提供してる
その提供してるってのがこれ。
" 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
要らないかなーとか思ってたんですが、リファクタリングする時はかなり便利かも。