Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

VimでPHPファイルを開くとhtmlのftpluginが読み込まれる

Vimfiletype plugin onを設定すると~/.vim/ftplugin以下にある(環境による)ファイルタイプに結びつくプラグインファイル(ftplugin)が読み込まれます。私はこのようにftpluginのファイルを置いています。

~/.vim/ftplugin/
    html.vim
    php.vim
    (other vim files...)

この状態でPHPファイルを開くとなぜか~/.vim/ftplugin/html.vimの設定が有効になっていることに気が付きました。shiftwidthなどの設定をhtml.vimにもphp.vimにも書いており、html.vimに書いた設定が有効になっていたので困っていたのです。

環境

とりあえずの回避策

set runtimepathを見ると

runtimepath=~/.vim,
    /usr/share/vim/vimfiles,
    /usr/share/vim/vim73,
    /usr/share/vim/vimfiles/after,
    ~/.vim/after`

となってたので~/.vim/after/ftplugin/php.vimPHPの設定を置くことにしました。これでPHPの設定が最後に読まれるはずです。

原因を探る

まだ~/.vim/ftplugin/html.vimが読まれる原因が分からなかったので、verboseモードでファイルを開いてみることにしました。vi -V9 foo.phpで開きました。(オプションの数値の9は「実行された autocommand 全て」を出力する設定ですVim documentation: options)このときのログを抜粋します。

Executing FileType Auto commands for "*"
autocommand call s:LoadFTPlugin()
Searching for "ftplugin/php.vim ftplugin/php_*.vim ftplugin/php/*.vim" in "/Users/takayuki_atkwsk/.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim73,/usr/share/vim/vimfiles/after,/Users/takayuki_atkwsk/.vim/after"
Searching for "/Users/takayuki_atkwsk/.vim/ftplugin/php.vim"
chdir(/Users/takayuki_atkwsk/.vim/ftplugin)
fchdir() to previous dir
line 17: sourcing "/Users/takayuki_atkwsk/.vim/ftplugin/php.vim"
finished sourcing /Users/takayuki_atkwsk/.vim/ftplugin/php.vim
continuing in function <SNR>12_LoadFTPlugin

...

Searching for "/usr/share/vim/vim73/ftplugin/php.vim"
chdir(/usr/share/vim/vim73/ftplugin)
fchdir() to previous dir
line 17: sourcing "/usr/share/vim/vim73/ftplugin/php.vim"
Searching for "ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim" in "/Users/takayuki_atkwsk/.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim73,/usr/share/vim/vimfiles/after,/Users/takayuki_atkwsk/.vim/after"
Searching for "/Users/takayuki_atkwsk/.vim/ftplugin/html.vim"
chdir(/Users/takayuki_atkwsk/.vim/ftplugin)
fchdir() to previous dir
line 20: sourcing "/Users/takayuki_atkwsk/.vim/ftplugin/html.vim"
finished sourcing /Users/takayuki_atkwsk/.vim/ftplugin/html.vim
continuing in /usr/share/vim/vim73/ftplugin/php.vim

はい、後ろから3行目で~/.vim/ftplugin/html.vimを読み込んでいますね。/usr/share/vim/vim73/ftplugin/php.vimを先に読み込んでいるので、このファイルを見てみましょう。

" Vim filetype plugin file
" Language: php
" Maintainer:   Dan Sharp <dwsharp at users dot sourceforge dot net>
" Last Changed: 20 Jan 2009
" URL:      http://dwsharp.users.sourceforge.net/vim/ftplugin

...

" Define some defaults in case the included ftplugins don't set them.
let s:undo_ftplugin = ""
let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .
        \        "All Files (*.*)\t*.*\n"
let s:match_words = ""

runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim

...

runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vimこの行によって~/.vim/ftplugin/html.vimが読み込まれるわけです。これでPHPファイルを開くとhtmlのftpluginが読み込まれる理由が分かりました。

まとめ

おさらいすると、filetype plugin onの場合にPHPファイルを開くとftpluginの読み込みはおおよそ以下のようになります。

  1. runtimepathに設定されている順に各パスのftplugin/php.vimが読み込まれる。
  2. /usr/share/vim/vim73/ftplugin/php.vim内で[runtimepath]/ftplugin/html.vimが読み込まれる。
  3. html.vimphp.vimで同じオプションを設定してPHPの設定を優先させたい場合は~/.vim/after/ftplugin/php.vimに書く。(デフォルトruntimepathだと最後に読み込まれる)

参考