vim の:filetype は ややこしい

:filetype関連の話題を見かけたので自分的な理解をめもめもしてみます。
おかしな所がありましたら見なかったことにしたり、あるいはご指摘いただけると助かります。

とりあえず困ったときは次のようにすると良いかなーと思っています。

" .vimrc 始めの辺りに書く
" 一旦ファイルタイプ関連を無効化する
filetype off
filetype plugin indent off

" いろいろ

" .vimrc 最後の辺りに書く
" ファイルタイプ関連を有効にする
filetype plugin indent on

特に

filetype off

を書き忘れてしまうと、システムのvimrcやexample_vimrc経由で意図せず :filetype on されていた場合に、ファイルタイプの検出がうまく動作しません。

on/offの書き方が少し違うのでややこしいなあと感じます。
それと、多重読み込み防止*1はありがたいのですが、そのおかげで必要なものが読み込まれないというのは悲しいなと感じています。

以下ファイルタイプ関連のコマンドとか

現状の確認

:filetype

ファイルタイプの自動検出、ファイルタイプ用の プラグインとインデント設定 を自動読み込みそれぞれの on/off を表示する。

:verbose :setlocal filetype?

現在開いているバッファのファイルタイプを表示する。
:verbose を付けなくてもファイルタイプを確認できますが、付けた場合は どこで設定されたのか も分かるので便利です。

有効にする

:filetype on

ファイルを開いたとき、ファイルタイプを自動検出するようになる。
最初に実行した時点で登録済みの検出方法が有効になる*2
実行後に登録された検出方法は利用されない。
また、on になっている場合はもう一度 :filetype on しても何も起こらない

:filetype plugin on

ファイルタイプが変更されたとき、ファイルタイプ用のプラグインを自動読み込みするようになる。

:filetype indent on

ファイルタイプが変更されたとき、ファイルタイプ用のインデント設定を自動読み込みするようになる。
このとき :filetype on も適用される。

:filetype plugin indent on

:filetype plugin on:filetype indent on を行った状態になる。
ファイルタイプの自動検出、ファイルタイプ用の プラグインとインデント設定 を自動読み込みするようになる。

無効にする

:filetype off

ファイルタイプの自動検出をしないようになる。
有効になっていた検出方法は無効化される。

:filetype plugin off

ファイルタイプ用のプラグインを自動読み込みしないようになる。

:filetype indent off

ファイルタイプ用のインデント設定を自動読み込みしないようになる。

:filetype plugin indent off

:filetype plugin off:filetype indent off を行った状態になる。
ファイルタイプ用の プラグインとインデント設定 を自動読み込みしないようになる。
ファイルタイプの自動検出についての設定は変化しない

そのほか

:filetype detect

現在開いているバッファのファイルタイプを自動検出する。

:setlocal filetype=SET_FILE_TYPE

現在開いているバッファのファイルタイプをSET_FILE_TYPEに設定する。

:setfiletype SET_FILE_TYPE

現在開いているバッファのファイルタイプをSET_FILE_TYPEに設定する。
このコマンドの内部では:setlocal filetype=SET_FILE_TYPE+色々をしている。
補完も利用できるので、こちらを使った方が良いのかもしれない。

関連ファイルとか

filetype.vim

ファイル名によるファイルタイプの決定方法を登録するスクリプト
$VIMRUNTIME 辺りに入っている。
:filetype onしたときに呼ばれる(はず)。

scripts.vim

ファイルの内容によるファイルタイプの決定方法を登録するスクリプト*3
$VIMRUNTIME 辺りに入っている。
filetype.vimの中で読み込まれる。

ftdetect/

ファイルタイプの自動検出するスクリプトを置く場所。
filetype.vimの中で読み込まれる。

ftplugin.vim, ftplugin/, ftoff.vim, ftplugof.vim

略。
スクリプト$VIMRUNTIME 辺りに入っている。

*1:登録処理は重い & autocmdの多重追加はよろしくない ので大切な処理だと思います

*2:実行時点で &rtp 内にあるもののみが登録される、と言うほうが正確か、でも雰囲気は伝わるはず

*3:名前が分かりにくいなあと。おそらく歴史的な?ものなのかと。詳しくは知らない