Vimでfiletype 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
に書いた設定が有効になっていたので困っていたのです。
phpファイルをVimで開くと .vim/ftplugin/html.vim の設定が有効になってしまう……。set filetype=php になってます。
— Takayuki at kwskさん (@TAKAyuki_atkwsk)
10月 29, 2012
環境
とりあえずの回避策
set runtimepath
を見ると
runtimepath=~/.vim,
/usr/share/vim/vimfiles,
/usr/share/vim/vim73,
/usr/share/vim/vimfiles/after,
~/.vim/after`
となってたので~/.vim/after/ftplugin/php.vim
にPHPの設定を置くことにしました。これでPHPの設定が最後に読まれるはずです。
ひとまず、 .vim/after/ftplugin/php.vim に設定を書くことで先ほどの状態は回避した。しかし、なぜphpファイルを開くと .vim/ftplugin/html.vim が読まれるのかは謎のまま。
— Takayuki at kwskさん (@TAKAyuki_atkwsk)
10月 29, 2012
原因を探る
まだ~/.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の読み込みはおおよそ以下のようになります。
- runtimepathに設定されている順に各パスの
ftplugin/php.vim
が読み込まれる。 /usr/share/vim/vim73/ftplugin/php.vim
内で[runtimepath]/ftplugin/html.vim
が読み込まれる。html.vim
とphp.vim
で同じオプションを設定してPHPの設定を優先させたい場合は~/.vim/after/ftplugin/php.vim
に書く。(デフォルトruntimepathだと最後に読み込まれる)