まくまくVimノート
モードラインでファイルごとに書式を設定する
2009-12-07

モードラインとは

テキストファイルの先頭か末尾に、モードライン (modeline) という特殊なコメントを埋め込んでおくと、そのファイルにだけ適用する Vim の設定を行うことができます。 複数人でフォーマットを揃えて1つのテキストファイルを編集したい場合などに便利です。 例えば C 言語のソースファイルなら以下のようなコメントを書いておくことで、そのファイルのインデント幅やタブ使用の有無を支持することができます。

/* vim: set shiftwidth=4:tabstop=4:expandtabs */

モードライン (modeline) の機能を有効にするには、以下のように設定しておく必要があります。

~/.vimrc

set modeline       "モードラインを有効にする
set modelines=5    "上端、下端から何行までをモードラインと認識するか

ファイルの先頭や末尾に記述するモードラインは、下記のようなフォーマットで記述します。

<任意のテキスト><スペース>vim: set ...:<任意のテキスト>

例えば、一行の文字数を 79 文字に制限して自動的に折り返すようにするには、テキストの最終行などに、以下のように記述しておきます。

# vim: set tw=79 fo=aM:

行頭と行末には任意のテキストを入れられるので、C++ のコメントとして以下のように記述することができます。

/* vim: set tw=79 fo=aM: */

モードラインの行末に任意のテキストを追加しなくてよい場合(行末までを Vim の設定値とみなしてよい場合)は、set の記載と、最後の : を省略することができます。

# vim: tw=79 fo=aM

モードラインの設定例

例: 79 文字で自動的に折り返す

# vim: tw=79 fo=aqwB ai

各オプションの意味は以下のようになっています。

  • tw=79 (textwidth) – 一行の文字数を 79 文字(+改行)に制限
  • fo=aqwB (formatoptions)
    • a – テキスト入力するごとに textwidth に設定した文字数で自動折り返し
    • qgq コマンドで、選択範囲をフォーマットする
    • w – 行末にスペースがある場合のみ、自動で行連結しようとする
    • B – 行を結合したときに日本語の間にはスペースを入れない
  • ai (autoindent) – 改行するときに自動的に現在の行と同じだけインデントする

formatoptions で、a と一緒に m を指定すると、文字挿入時に日本語などのマルチバイト文字でも自動改行するようになりますが、a オプションと相性がよくないので、m は指定しない方がよいです。 例えば、カーソルより後ろの日本語文章が自動改行されると、改行された後ろのテキストに余計なスペースが入ったり、1 文字ごとに改行されてしまったりします。 なので、日本語テキストを整形したい場合は、整形したい領域を選択し、gq で手動整形するのがよいです。

例: メールの下書き用の設定

# vim: tw=76 fo=aqwB ai ts=2 et sw=2 sr

下記は各オプションの概要です。

  • tw=76 (textwidth) – 一行の文字数
  • fo=aqwB (formatoptions) – 自動改行の設定
  • ai (autoindent) – 改行時のオートインデント
  • ts=2 (tabstop) – タブの半角スペース数
  • et (expandtab) – タブを展開
  • sw=2 (shiftwidth) – シフト時のスペース数
  • sr (shiftround) – シフト時に丸める

日本語を自動整形する場合は、Shift-V で対象範囲を選択して gq と入力します。

2009-12-07