Previous: Locals, Up: Variables


28.2.5 ファイルにローカルな変数

Emacsでファイルを編集する際に、そのファイルに対応したローカル変数と その値を指定することができます。 Emacsはファイルを訪問すると、ローカル変数指定の有無を検査し、 あれば指定された変数を自動的にバッファにローカルにして、 その値をファイルで指定された値に設定します。

ローカル変数とその値を設定するには2つの方法があります。 1つはファイルの先頭行に書くことで、 もう1つはローカル変数リストを書くことです。 先頭行に書く場合は、たとえばつぎのようにします。

     -*- mode: modename; var: value; ... -*-

変数とその値を「:」で区切った対を「;」で区切って並べ、 いくつでも指定できます。 mode: modename;はメジャーモードを指定するもので、 行の最初にある必要があります。 valueは評価されずに書かれているとおりのまま使われます。 以下は、Lispモードで2つの変数に数値を設定する例です。

     ;; -*-mode: Lisp; fill-column: 75; comment-column: 50; -*-

この方法では、ファイルのコーディングシステムも指定できます。 つまり、codingという名前の『変数』に値を指定すればよいのです。 『値』は、Emacsが認識できるコーディングシステム名である必要があります。 See Coding Systems

一方、ローカル変数リストはファイルの末尾(最後のページ)に置きます。 (最後のページにはローカル変数リストだけを置くというのを勧めます。) ローカル変数リストは‘Local Variables:’という内容を含む行で始まり、 ‘End:’という内容を含む行で終ります。 これらの行のあいだに、1つの変数につき1行ずつ、 ‘variable: value’という形で変数の名前と値を指定します。 valueは評価されずにファイルに書かれたとおりにそのまま使われます。 ファイルにローカル変数リストと‘-*-’の行が両方含まれていた場合には、 Emacsはまず‘-*-’の行をすべて処理してから、 続いてローカル変数リストの内容をすべて処理します。

以下にローカル変数リストの例を示します:

     ;;; Local Variables: ***
     ;;; mode:lisp ***
     ;;; comment-column:0 ***
     ;;; comment-start: ";;; "  ***
     ;;; comment-end:"***" ***
     ;;; End: ***

上の例では、各行は‘;;;’で始まり‘***’で終っています。 Emacsはこれらの接頭辞と接尾辞をリストの最初の内容に基づいて認識します。 つまり、特別な文字列‘Local Variables:’の前後の文字列を、 それぞれ、接頭辞、接尾辞とみなし、 それ以降の行についてはこの接頭辞と接尾辞を無視します。

接頭辞と接尾辞を使う主な理由は、 ローカル変数リストをコメントの中に入れることで、 そのファイルを読み込む他のプログラムを困惑させないようにすることです。 上の例では、コメントが‘;;;’で始まり‘***’で終るような言語を 想定しています。 変数comment-startcomment-endのローカルな値で、 このような変な構文に対処するようにEmacsをカスタマイズするのです。 必要ないのであれば、接頭辞(と接尾辞)は使わないでください。

ローカル変数リストにおいては、2つの変数名が特別な意味を持ちます。 変数modeに対する値は、実際にはメジャーモードを設定します。 変数evalに対する値は、式として評価されますが、 その結果は捨てられます。 modeevalは本当の変数ではなく、他の状況で これらの名前の変数に値を設定してもなんら特別な意味を持ちません。 メジャーモードを設定するためにmodeを指定する場合は、 ローカル変数リストの先頭に書く必要があります。

仮想的な『変数』modeは、メジャーモードだけでなくマイナモードを 設定するのにも使えます。 実は、この指定は2回以上使うことができて、 最初はメジャーモードを設定し、 それ以降は(それぞれ)マイナモードを設定します。 しかし、マイナモードはユーザーの好みに応じて選ぶものですから、 普通はファイルでマイナモードを指定するべきではないでしょう。

たとえば、ローカル変数リストで自動詰め込み(auto-fill)モードをオンにしたいと 思うかもしれませんが、それはまちがいです。 自動詰め込みにするかどうかは、個人の好みの問題であり、 ファイルの中身によって決まるものではないからです。 ある種別のファイルでいつも自動詰め込みにしたければ、 個人の.emacsファイルで(状況に応じて)自動詰め込み(auto-fill)モードを オンにするようなメジャーモードのフックを設定してください (see Init File)。 ローカル変数リストで他人に好みを押し付けてはいけません。

ローカル変数リストは、ファイルの末尾から3000文字以内にある必要があり、 ファイルがページに分かれている場合には最後のページにある必要があります。 これらが守られていないと、 Emacsはローカル変数リストがあることを認識しません。 これらの規則の目的は、最後ではないページに偶然 ‘Local Variables:’があってもEmacsが誤認しないようにすることと、 全体が1ページでローカル変数リストを持たない長いファイルを訪問するときでも ファイル全体を探さなくてもすむようにするためです。

バッファのローカル変数やメジャーモードを、 ローカル変数リストがあるときにはそれによる指定も含めて、 ファイル名とファイルの内容に基づいたものにリセットしたければ、 normal-modeコマンドを使ってください。 See Choosing Modes

変数enable-local-variablesは、 ファイル中のローカル変数指定を処理するか否かを制御します。 つまり、ローカル変数指定を無視するようにもできます。 デフォルトはtで、ファイル中のローカル変数指定を処理します。 値をnilにすると、ファイル中のローカル変数指定を無視します。 これら以外の値の場合は、ファイル中にローカル変数指定があると、 その内容を表示して処理するかどうか問い合わせます。

仮想的な『変数』evalといくつかの(実在する)変数に対する指定は、 ある種の危険性をもたらします。 他人のファイルを訪問したとき、そこに書かれているローカル変数指定に よってあなたが使っているEmacsのふるまいがどのようにでも変更できるからです。 このため、オプションenable-local-evalにより、 変数eval、さらに、‘-hook’、‘-hooks’、‘-function’、 ‘-functions’という名前で終る変数、および、他のいくつかの変数に 対するローカル変数指定を処理するかどうか制御できるようになっています。 enable-local-variablesと同じように指定できる値は3種類あって、 tnil、これら以外です。 デフォルトはmaybeで、これはtでもnilでもありませんから、 Emacsはこれらのローカル変数指定があるときは確認を求めてきます。