読者です 読者をやめる 読者になる 読者になる

第13回 LOCAL PHP部 勉強会でvimの話をしてきました

PHP vim

この手のイベントに参加するの、、、というか仕事以外で人と会うの何ヶ月ぶりだろうというくらい引き込もってましたが。

言い忘れてたことや補足など

デモでやったのは、htmlファイルを開きつつ

:let b:match_words .= ',{if:{else:{/if'

みたいなことをやりました。これは、$VIMRUNTIME/ftplugin/html.vimで設定されているb:match_wordsの後に付け足してるわけです(演算子".="はPHPと一緒で文字列の連結です)。

で、これにさらに、foreach, foreachelse, /foreachをつけ足す場合、

:let b:match_words .= ',{if:{elseif:{else:{/if,{foreach:{foreachelse:{/foreach'

としてしまうと、"{foreach"というパターンが"{foreachelse"という文字列にもマッチしてしまうのでうまくいきません。なので、文字列の区切りを表す正規表現を使って、

:let b:match_words .= ',{if\>:{elseif\>:{else\>:{/if\>,{foreach\>:{foreachelse\>:{/foreach\>'

としておくのが良いと思います。

また、smartyのタグはdelimiterとタグの間に空白を入れても良いようなので、

{foreach ...}
{  if $foo}
{    if $bar}
{    /if}
{  /if}
{/foreach}

のようにも書けるようです。これも考慮すると、

:let b:match_words .= ',{\s*if\>:{\s*elseif\>:{\s*else\>:{\s*/if\>,{\s*foreach\>:{\s*foreachelse\>:{\s*/foreach\>'

となります。

さて、このような設定をどこに書くかなのですが、単に.vimrcに書くと上手くいきません。先に述べた通り、この設定は$VIMRUNTIME/ftplugin/html.vimより後に行なわなければいけないためです。

解決方法は色々あるのですが、$HOME/.vim/after/ftplugin/html.vimというファイルにこの設定を書くのがおそらく最も簡単な方法だと思います。この辺は:help runtimepathなどをご覧下さい。

project.vimはググれば説明が沢山あると思います。