vim-users.jp

Hack #20: モードラインでファイルごとにオプションを設定する

Posted at 2009/06/02
このエントリーをはてなブックマークに追加

モードラインとは

ある特定のファイルに対して、例えばそのファイルではタブ幅を 8 に固定して欲しかったり、右端で折り返して欲しくなかったりすることがあります。こう言った場合ローカルオプションを設定する必要がありますが、一々設定するのは面倒です。そういう時はモードラインが使えます。 モードラインは、ファイル内に特定の書式の文字列を埋め込んでおくことで、そのファイルを開いた際に自動で Vim のオプションを設定する仕組みです。

モードラインの書式

モードラインの書式は 2 通りあります。ここではこの 2 つを便宜上 “書式 1″ “書式 2″ と呼ぶことにします。

書式 1
[text]{white}{vi:|vim:|ex:}[white]{options}
書式 2
[text]{white}{vi:|vim:|ex:}[white]se[t] {options}:[text]
[text]空文字列を含む任意のテキスト。
{white}半角スペースもしくはタブ文字。
{vi:|vim:|ex:}“vi:” “vim:” “ex:” のうちいずれかの文字列。
[white]半角スペースもしくはタブ文字。なくてもよい。
se[t]“set ” “se ” のうちいずれかの文字列。空白を含むのに注意。
{options}:set コマンドに渡す引数。書式 1 に限りオプションの区切りにコロン “:” も使用できる。
例:
-- vim:ts=8:sw=2:sts=2:st:et
/* vim:set ft=c tw=78 fdm=marker: */

{vi:|vim:|ex:} の前にある空白は、誤認識を減らすためにあります。また、例外として行頭にある “ex:” は example: の略の可能性があるため無視されます。書式 2 は書式 1 と比べて se[t] と最後のオプションの後のコロンが必要です。オプションの値に “:” を入れたい場合は “\” でエスケープする必要があります。

書式 1 と書式 2 の大きな違いは、末尾に任意の文字列を入れられるかどうかです。モードラインをソースコードに書き込む場合必然的にコメント内に書き込むことになりますが、C 言語のように行コメントがない言語の場合は、末尾に文字の入れられる書式 2 の方が便利です。あとはどちらを使うかは基本的に好みの問題です。

適用する Vim のバージョンを限定する

普段用いられることはほとんどありませんが、”vim:” の文字列内にバージョンを表記することでそのモードラインを使用する Vim のバージョンを限定することができます。以下のように指定します。

vim{vers}:バージョン {vers} 以降
vim<{vers}:バージョン {vers} より前
vim={vers}:バージョン {vers}
vim>{vers}:バージョン {vers} より後

“vim:” 以外の “vi:” や “ex:” ではこの指定はできません。ここで {vers} は Vim のメジャーバージョン番号を 100 倍したものにマイナーバージョン番号を足したものです。例えば、Vim 7.2 の場合は 702 になります。この数値は Vim スクリプトで利用できる組み込み変数 v:version と同じものです。

モードラインを書く場所

モードラインはファイルの先頭もしくは末尾に記述します。どの範囲に書かれたものが有効かは、後述する 'modelines' で設定します。

有効な範囲内に書かれたモードラインは全て適用されます。複数のモードラインを書けばその分が上から順に適用されます。ファイルの先頭と末尾の両方に書いても大丈夫です。

モードラインのオプション

モードラインに関するオプションは以下の 2 つがあります。

'modeline'
形式: boolean
バッファについてローカル
このオプションが on だと、モードラインが認識されます。通常はデフォルトで on ですが、'compatible' が on (Vi 互換モード) の場合の他、Unix 系 OS における root ユーザの場合もデフォルトで off になるので、必要なら vimrc などで有効にしておくと良いでしょう。
'modelines'
形式: number
グローバル
モードラインを認識する行数を設定します。ファイルの先頭もしくは末尾からこのオプションで指定した行数だけモードラインを探します。0 を設定すると 'modeline' が on でもモードラインはチェックされません。

設定されるオプションの扱い

モードラインによって設定されたオプションは :setlocal で設定された場合と同じようになります。グローバルオプションを設定することもできますが、モードラインの目的を考えると不適切なのでやめておいた方がいいでしょう。

設定できないオプション

'makeprg' などの一部のオプションは、セキュリティ上モードラインで設定することはできません。設定できないオプションは help の各オプションの項目でその旨が記載されています。

最後に

モードラインは便利な機能ですが、Vim を使っている人以外には理解不能な謎の文字列になります。特に共有するファイルで使用する場合には注意してください。

thinca

もどる
blog comments powered by Disqus