Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

はじめに

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

https://github.com/neovim/neovim/blob/045e86474b75992834f54157b04ea2a941ab03a7/runtime/filetype.vim#L1380

抜粋

auBufNewFile,BufRead *.rb,*.rbw        setfruby

COMMIT_EDITMSG

https://github.com/neovim/neovim/blob/045e86474b75992834f54157b04ea2a941ab03a7/runtime/filetype.vim#L618

抜粋

auBufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG  setf gitcommit

おわりに

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

参考


Viewing all articles
Browse latest Browse all 5608

Trending Articles