はじめに
Vim が各ファイルの形式をどうやって検出しているのか気になったので、マニュアルを読んで調べてみました。
疑問
Vim では、:echo &filetype
で現在開いているファイルの形式を確認できます。
例えば ruby であれば、test.rb
というファイルを開いたら上記コマンドの結果は ruby
となりますし、git のコミットメッセージを編集するときのファイルである COMMIT_EDITMSG
であれば gitcommit
になります。
しかしこの判別をどのようにやっているかがよくわかっていなかったので、調べてみました。
filetype について
Vim のマニュアルには以下のように書かれています。自分の疑問だった点を抜粋します。
Vimは編集しているファイルの形式を検出することができる。これはファイル名をチェ
ックしたり、場合によってはファイル内に特定のテキストがあるかを調べることで実現
されている。
(中略)
ファイル形式の検出を有効化するには、vimrcファイルでこのコマンドを使用する:
:filetype on
(中略)
詳細: ":filetype on" コマンドは次のファイルのうち1つをロードする。
Amiga $VIMRUNTIME/filetype.vim
Mac $VIMRUNTIME:filetype.vim
MS-Windows $VIMRUNTIME\filetype.vim
Unix $VIMRUNTIME/filetype.vim
VMS $VIMRUNTIME/filetype.vim
このファイルはBufNewFileとBufReadイベントに対する自動実行コマンドを定
義するVim scriptファイルである。
上記より、$VIMRUNTIME/filetype.vim
に書かれている処理によって、ファイルの種類を判別しているようです。
ファイルを確認する
$VIMRUNTIME/filetype.vim
は、Vim 上で :echo $VIMRUNTIME
を実行すれば実際のディレクトリパスが確認できるので、そこにある filetype.vim
を参照すれば実装を確認できます。
リポジトリ上では以下で確認できます。僕は neovim を使っているので、neovim のリポジトリを紹介します。
ruby
抜粋
auBufNewFile,BufRead *.rb,*.rbw setfruby
COMMIT_EDITMSG
抜粋
auBufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG setf gitcommit
おわりに
ファイル形式の判定は定義ファイルをもとにやっていたことがわかってよかったです。Vim のマニュアルは、仕組みの部分まで言及しているので読んでて面白いですね。