LoginSignup
2
0

More than 3 years have passed since last update.

Vim の filetype の判定方法について軽く調べてみた

Posted at

はじめに

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

抜粋

au BufNewFile,BufRead *.rb,*.rbw        setf ruby

COMMIT_EDITMSG

抜粋

au BufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG  setf gitcommit

おわりに

ファイル形式の判定は定義ファイルをもとにやっていたことがわかってよかったです。Vim のマニュアルは、仕組みの部分まで言及しているので読んでて面白いですね。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0