タオルケット体操

サツバツいんたーねっとでゲームとかガジェットのレビューとかをします

setftとset ft=vimの違い

今までなんとなく使ってたし、ブログとかでも特に言及とかはない感じだったので漫然と混在して使ってました。
しかし、ここのところファイルタイプ検出が不安定で$HOME/.vim/filetype.vimを設定しなおしてて気になったので:help setfiletypeしてみたらずばりだった。実際古事記ばりの情報量な。

以下引用

:setf[iletype] {filetype}         *:setf* *:setfiletype*
            Set the 'filetype' option to {filetype}, but only if
            not done yet in a sequence of (nested) autocommands.
            This is short for: >
                :if !did_filetype()
                :  setlocal filetype={filetype}
                :endif
            This command is used in a filetype.vim file to avoid
            setting the 'filetype' option twice, causing different
            settings and syntax files to be loaded.
            {not in Vi}

ざっくり訳すと、

「ファイルタイプを設定するオプションです。ただし連続した(入れ子になった)autocmdの途中で設定されていない場合に限ります」
「このコマンドは filetype.vim の中で、'filetype' オプションが重複して設定され、そのせいで異なるftpluginやsyntaxがロードされることを避ける為に使われます」

みたいな感じだろうか。
しかし続くコード例をみる感じ、autocmdとか関係なしにfiletypeが設定済みかどうかをみているだけっぽい気がする。こういうときはコードの導きを信じるべし。

というわけで、今までの.vim/filetype.vimでは

if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
 au BufRead,BufNewFile *.vb setf vbnet
 autocmd BufRead,BufNewFile *.md setl ft=markdown
 autocmd BufRead,BufNewFile *.mkd setl ft=markdown
augroup END

みたいな感じに混在させていたのを、全て'setf'に統一することにした。