← Vim研究所

Vimでファイルタイプを手動指定してハイライトを適用する

2020-02-11 公開 ・ 更新: 2026-08-20

保存前の無題バッファにコードを書いていると、シンタックスハイライトがまったく効かず読みにくくなります。拡張子で自動判定される仕組みなので、まだファイル名が無い状態では判定のしようがないのは当然ですが、それでも手動で指定すれば解決できます。

目次(11項目)
コマンドこれだけ覚える
:set filetype=xxx / :set ft=xxx言語を手動指定してハイライトを適用
:set filetype?現在の判定を確認
:syntax on / :set syntax=xxx色付けだけを変更(インデント等には影響しない)
autocmd ... setfiletype xxx特定の拡張子・パスを自動判定

ファイルタイプを指定する

:set filetype=markdown
:set ft=markdown   " 省略形

言語名を指定するだけで、その言語用のシンタックスハイライトやインデントルールが即座に適用されます。保存前のメモ書きにMarkdownやコードのハイライトを効かせたいときに便利です。

自動判定が誤っているとき

拡張子から自動判定されるfiletypeが、内容と合っていないことがあります。テンプレートファイルや複数の言語が混在するファイルでは、判定がずれやすくなります。そんなときも同じコマンドで正しい言語を指定し直せます。

現在のfiletypeを確認する

:set filetype?

今どの言語として認識されているかを確認したいときは、末尾に?を付けて実行します。ハイライトの効き方がおかしいと感じたら、まずこれで現在の判定を確認すると安心です。

filetypeとsyntaxの違い

紛らわしい2つのオプションですが、制御する範囲がそもそも違います。

filetypesyntax
制御する範囲 インデント・折りたたみ・プラグインの挙動を含む「言語としての扱い」全体 色付け(ハイライト)だけ
確認 :set filetype? :set syntax?
変更 :set filetype=xxx :set syntax=xxx

色だけを変えたいなら:syntax on:set syntax=で足りる場面もありますが、インデントや折りたたみまで言語らしく振る舞わせたいならfiletype側を設定する必要があります。

自動判定の仕組みを補強する

特定の拡張子が毎回誤判定される場合は、autocmdでルールを追加しておけます。

autocmd BufNewFile,BufRead *.conf setfiletype dosini

頻繁に手動指定し直す羽目になるファイルパターンがあるなら、このように設定ファイルに書いておいたほうが毎回のコマンド入力を省けます。

要点:無題バッファや誤判定のファイルには:set filetype=で言語を明示的に指定します。頻発するパターンはautocmdで自動化しておくと手間が減ります。
使ってみて

保存前のメモにJSONを書き殴っているとき、ハイライトが効かず構文ミスに気づけないことがよくありました。:set ft=jsonを打つ癖をつけてからは、保存前でも構文エラーに気づきやすくなり、無駄な手戻りが減りました。テンプレートファイルで拡張子と中身の言語が一致しないケースでも、この一手間で快適に編集できるようになりました。

プラグインとの連携

LSPやシンタックスチェッカーの多くはfiletypeの値を見て、どの言語サーバーやチェッカーを起動するかを判断しています。誤判定のまま作業していると、これらのツールも正しく機能しません。ハイライトが効かないだけでなく補完や診断まで動かないと感じたら、まず:set filetype?で言語判定を疑うのが近道です。

setfiletype と set filetype= の違い

似た2つの書き方があり、意味が違います。:set filetype=sh は無条件に設定しますが、:setfiletype sh はまだ設定されていない場合だけ設定します。

:set filetype=sh       " 必ず上書きする
:setfiletype sh        " まだ決まっていなければ設定する

自動判定のルールを自分で書き足すときは、後者を使うのが作法です。他のルールがすでに判定していれば、それを尊重してくれます。手元で今すぐ切り替えたいだけなら前者で構いません。

ファイルの中身で判定させる

拡張子が無い、あるいは拡張子が当てにならないファイルは、中身の1行目を見て判定できます。シェルスクリプトのシバンのように、先頭行に手がかりがある場合に効きます。

autocmd BufRead * if getline(1) =~ '^#!.*\<python' | setfiletype python | endif

実はVimは既定でもシバンを見て判定します。うまくいかないのは、シバンが独自の形式だったり、1行目にコメントが入っていたりする場合です。:set filetype? で今どう判定されているかを確かめてから、必要なぶんだけ足してください。

プロジェクトごとに切り替える

同じ拡張子でも、プロジェクトによって中身の言語が違うことがあります。.conf.tpl のような汎用的な拡張子でよく起こります。パスで条件を絞れば、プロジェクトごとに別の判定にできます。

autocmd BufRead,BufNewFile */nginx/*.conf setfiletype nginx
autocmd BufRead,BufNewFile */ansible/*.yml setfiletype yaml.ansible

2つめのようにドットでつなぐと、複数のファイルタイプを同時に指定できます。両方の設定とプラグインが読み込まれるので、YAMLの基本機能に加えてAnsible固有の補完も効くようになります。設定が反映されないときはscriptnamesの記事で読み込み順を確かめてください。

まとめ

:set filetype=は、自動判定に頼れない場面での頼れる保険になります。頻発するならautocmdで自動化するとさらに快適です。

関連記事

← Vim研究所 トップへ戻る