便利なんだけどあまり知られてなさそうなPHPer向けvim pluginのご紹介

[PHP Advent Calendar 2016](http://qiita.com/advent-calendar/2016/php) の 8日目のエントリです。

いきなりで申し訳ないのですが、正直に申し上げるとPHPer全員に使っていただきたいエディタは、 PhpStorm + IdeaVIM だと考えています :bow:
しかしPhpStormは有料です。会社ではゴリゴリPHP書いてるけど家ではたまーーにしかPHPを触らない人にとってはちょっとお財布への負担が大きいです。

vimであれば、PhpStorm ほど優秀ではありませんが、最低限の補完はできるし無料です。goとPHPといった複数の言語を使っているようなプロダクトでも画面を縦に割って別々の言語を編集できたりします。[^1]

[^1]: PhpStormでも内部にTerminalを出せるのでTerminalから別言語を編集なんてこともやろうと思えばできるわけですが… :sweat_drops: 

vim はプラグインを入れたり設定を書く事で簡単に拡張できます。vimでPHPを書くために役に立つプラグインはたくさんありますが、今日はその中でも便利なんだけどネット上であまり使ってる話を見ないプラグインを紹介させていただきたいと思います。

# 1. vim-phpfmt

![b.gif](https://qiita-image-store.s3.amazonaws.com/0/34176/1e9982bb-c335-5ee1-0193-8fa0c5aa46e5.gif)

go 言語を書く時に vim-go プラグインを入れてちょっとセットアップすると、保存したタイミングで自動的にコードフォーマットを修正してくれますよね。自動でフォーマットする事でtabはsoftがいいとかhardがいいとか括弧の位置が…とかいう不毛な争いをなくす事ができて良いです。

PHPで同じ事をするには [vim-phpfmt](https://github.com/beanworks/vim-phpfmt) というプラグインを使います。プラグインはパッケージ管理システムを利用すると簡単にインストールできます。

私は Vundle を使っているのですが、 Vundle だとこんな感じです。[^2]

[^2]: Vundleのセットアップには、[VimのVundleによるプラグイン管理 - Qiita](http://qiita.com/1987yama3/items/1caa0e167912a51ae9cc) が参考になります。

```vim
Bundle 'beanworks/vim-phpfmt'
```

vim-phpfmt はコードフォーマットのお膳立てをしてくれるだけで、実際の整形作業は [PHP CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) が行います。 プラグインの third_party ディレクトリ下に phpcbf.phar が入っているのでそれを使ってもよいですが、composer を使うと簡単に自前でインストールできます。

```bash
composer global require "squizlabs/php_codesniffer=*"
```

`` $HOME/.config/composer/vendor/bin `` に実行ファイルが置かれるのでパスを通せばOKです。

以下のような設定を追加することで、保存時に自動的に PSR2 に変換して保存してくれるようになります。 また、 `` g:phpfmt_standard `` の値を変更する事で他のフォーマットにも対応できます。

```vim
""
" vim-phpfmt
"
" A standard type: PEAR, PHPCS, PSR1, PSR2, Squiz and Zend
let g:phpfmt_standard = 'PSR2'
let g:phpfmt_autosave = 1
```

開いているプロジェクトによってルールが違ったりする事もあると思うので、開いているパスを見るなどして動的に変更するのも良いでしょう。

インデントだけじゃなくて括弧省略したif文なんかも適切に置換してくれるので見てて面白いです。

# 2. php_localvarcheck

このプラグインはすごいです。ファイル内で未使用変数や未定義変数を動的に検出し、変数名の色を変えて警告してくれます。
言葉で説明するよりも以下の画像を見ていただいたほうが早いでしょう。

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/34176/8f93185c-d05b-a550-b5c6-58d5d00ebabe.gif)

ファイル全体のチェックというよりは、カーソルがメソッド内に入るとそのメソッド内での未使用、未定義変数をチェックしてくれるみたいです。

公式にあるものは、[Vim7.3あたりで導入された新しい正規表現エンジンに対応できてなくて](https://github.com/kien/ctrlp.vim/issues/426) [エラーがでてしまう](https://github.com/vim-scripts/php_localvarcheck.vim/pull/1)ので、[flyinshadow/php_localvarcheck.vim](https://github.com/flyinshadow/php_localvarcheck.vim)を使うとよいです。 
Vundleなら以下の設定を追加すればインストールできます。

```vim
Bundle 'flyinshadow/php_localvarcheck.vim'
```

私はグローバルのチェックは必要ないかなと思ったので以下の設定を追加しています。

```vim
let g:php_localvarcheck_enable = 1
let g:php_localvarcheck_global = 0
```

# 3. errormarker.vim + vimparse.php

![c.gif](https://qiita-image-store.s3.amazonaws.com/0/34176/fff9d05a-057b-9b57-9149-0e624f231d0d.gif)

errormarker.vim を使うと、make実行時に発生したコンパイルエラーのメッセージを見て該当行の色付けができたりするのですが、
vimparse.php を使うことで、make時に自動的にlintを行い、エラーが発生したときに errormarker.vim を使ってエラー行を目立つように表示してくれます。

errormarker.vim は [公式サイト](http://www.vim.org/scripts/script.php?script_id=1861) からもダウンロードできます。 Vundleなら以下で入ります。

```vim
Bundle 'errormarker.vim'
```

errormarker.vimのインストールができたら次はvimparse.phpです。 vimparse.php は composer 経由でインストールできます。

```bash
composer global require ha1t/php-vimparse
```

インストールができたら vimparse.php を呼べるように `` $HOME/.config/composer/vendor/bin `` にパスを通してください。

そしたら filetype が PHP の時に以下の設定が読まれるようにすればOKです。

```vim
if executable('vimparse.php')
  setlocal makeprg=vimparse.php\ %\ $*
  setlocal errorformat=%f:%l:%m
  setlocal shellpipe=2>&1\ >
  autocmd BufWritePost <buffer> silent make
endif
```

# おわりに

「知らなかった使ってみよう」と思ったプラグインはありましたか？ 他にも便利なんだけどあまり知られてなさそうなPHP向けのvim pluginがあったら教えてください :smiley: