ファイルローカル変数を指定するには2つの方法があります。1つは最初の行に記述する方法で、もう1つはローカル変数リストを使用する方法です。以下は最初の行でこれらを指定する方法の例です:
-*- mode: modename; var: value; ... -*-
この方法により、任意の数の変数/値(variable/value)ペアーを指定できます。各ペアーはコロンとセミコロンで区切ります。特別な変数/値ペアーmode:
modename;
が与えられた場合にはメジャーモードを指定します(サフィックス“-mode”なし)。valueは文字列として使用されて、評価はされません。
手作業でエントリーを追加するかわりに、M-x add-file-local-variable-prop-lineを使用することができます。このコマンドは変数と値の入力を求め、適切な方法で最初の行にこれらを追加します。M-x delete-file-local-variable-prop-lineは変数の入力を求め、最初の行から変数のエントリーを削除します。コマンドM-x copy-dir-locals-to-file-locals-prop-lineは、カレントのディレクトリーローカル変数を最初の行にコピーします(ディレクトリーごとのローカル変数を参照してください)。
以下は、最初の行でLispモードを指定して、2つの変数に数値をセットする例です:
;; -*- mode: Lisp; fill-column: 75; comment-column: 50; -*-
mode
の他に、ファイル変数として特別な意味をもつキーワードはcoding
、unibyte
、eval
です。これらは以下で説明します。
シェルスクリプトでは、最初の行はスクリプトのインタープリターの識別に使用されるので、ローカル変数をそこに置くことはできません。これに対処するために、Emacsは最初の行がインタープリターを指定しているときは、2行目からローカル変数指定を探します。man pagesにも同じことが言えます。man pagesはtroffプリプロセッサーのリストを指定するマジック文字列‘'\"’で始まるからです(しかし、すべてがこれを行なう訳ではありません)。
‘-*-’行を使用するのではなく、ファイルの終端付近でローカル変数リスト(local variables list)を使用することにより、ファイルローカル変数を定義することもできます。ローカル変数リストは、ファイル終端から3000文字以内で開始され、ファイルがページに分かれているときは最後のページになければなりません。
ファイルにローカル変数リストと‘-*-’の両方がある場合、Emacsは最初に‘-*-’行のすべてを処理してから、ローカル変数リストのすべてを処理します。例外はメジャーモード指定です。Emacsはメジャーモード指定がどこにあろうと、まずそれを適用します。なぜならほとんどのメジャーモードは、初期化部分ですべてのローカル変数をkillするからです。
ローカル変数リストは、文字列‘Local Variables:’を含む行で開始され、文字列‘End:’を含む行で終了します。この間には、以下のように1行に変数名と値のペアーが記述されます:
/* Local Variables: */ /* mode: c */ /* comment-column: 0 */ /* End: */
この例では、各行はプレフィクス‘/*’で始まり、サフィックス‘*/’で終了します。Emacsは、リストの最初の行のマジック文字列‘Local Variables:’を囲む文字列から、プレフィクスとサフィックスを識別します。その後はリストの他の行で自動的にこれらを破棄します。プレフィクスおよび/またはサフィックスを使用する通常の理由は、そのファイルが意図する他のプログラムが混乱しないように、ローカル変数をコメントに埋め込むためです。上記は、コメントが‘/*’で始まり‘*/’で終わるCプログラミング言語での例です。
Emacsのローカル変数リストではないが、そのように見えるテキストがある場合は、そのテキストの後にフォームフィード文字(ページ区切りです。ページを参照してください)を挿入して、それを取り消すことができます。Emacsはファイルの最後のページ(つまり最後のページ区切りの後)にあるファイルローカル変数だけを調べます。
ローカル変数を直接タイプするかわりに、コマンドM-x add-file-local-variableを使用することができます。これは変数と値の入力を求め、それらをリストに追加し、‘Local Variables:’と、必要なら開始・終了マーカーも追加します。コマンドM-x delete-file-local-variableは、リストから変数を削除します。M-x copy-dir-locals-to-file-localsは、ディレクトリーローカル変数をリストにコピーします(ディレクトリーごとのローカル変数を参照してください)。
‘-*-’行と同じように、ローカル変数リストの変数は文字列として使用され、最初に評価されることはありません。長い文字列値をファイル内で複数行に分割したい場合、改行とバックスラッシュを使用できます(Lisp文字列定数では無視されます)。各行には、プレフィクスとサフィックスを記述するべきです。たとえ行がその文字列で開始または終了していても、それらはリストを処理するとき取り除かれます。以下は例です:
# Local Variables: # compile-command: "cc foo.c -Dfoo=bar -Dhack=whatever \ # -Dmumble=blaah" # End:
いくつかの名前は、ローカル変数リスト内で特別な意味をもちます:
mode
は、指定されたメジャーモードを有効にします。
eval
は、指定されたLisp式を評価します(式が返す値は無視されます)。
coding
は、このファイルでの文字コード変換にたいするコーディングシステムを指定します。コーディングシステムを参照してください。
unibyte
の値がt
の場合、Emacs
Lispのロードとコンパイルをunibyteモードで行ないます。Disabling
Multibyte Characters in GNU Emacs Lisp Reference Manualを参照してください。
これら4つのキーワードは、実際には変数ではありません。他のコンテキストでこれらをセットしても、特別な意味はありません。
Emacsの複数のバージョン間にまたがってファイルを編集するような場合に、新しいバージョンのEmacsではそのファイルを処理する新たなモードが導入されたとします。新しいバージョンのEmacsでは新たなモード(たとえばmy-new-mode
)、そして古いバージョンのEmacsでは古いモード(たとえばmy-old-mode
)にフォールバックするという具合に、mode
エントリーを複数使うことができます。1行目でモードを有効にしている場合には、以下のように記述します:
-*- mode: my-old; mode: my-new -*-
Emacsは見つかったモードの中から最後に定義されたモードを使用するので、古いバージョンのEmacsではmy-new-mode
は無視されますが、my-new-mode
が定義されているバージョンのEmacsではmy-old-mode
が無視されます。同様にして、ファイル終端のローカル変数ブロックでは以下のように記述します:
Local variables: mode: my-old mode: my-new
マイナーモードにたいしてmode
キーワードを使用しないでください。ローカル変数リストでマイナーモードを有効または無効にするには、eval
でモードコマンドを実行するLisp式を指定します(マイナーモードを参照)。たとえば以下のローカル変数リストは、引数なし(引数に1を指定しても同じことを行なう)でeldoc-mode
を呼び出すことにより、ElDocモード(プログラミング言語ドキュメントの照会を参照)を有効にし、引数−1でfont-lock-mode
(Font Lockモードを参照)を呼び出すことにより、Font Lockモードを無効にする例です。
;; Local Variables: ;; eval: (eldoc-mode) ;; eval: (font-lock-mode -1) ;; End:
しかしこの方法でマイナーモードを指定するのは、間違っている場合もあることに注意してください。マイナーモードは個人の好みを表しており、そのファイルを編集するユーザーにあなたの好みを強制するのは、不適切かもしれません。状況に依存して自動的にマイナーモードを有効または無効にしたい場合は、たいていメジャーモードフックでこれを行なう方がよいのです(フックを参照してください)。
ローカル変数と、ファイル名とファイル内容にしたがったバッファーのメジャーモード(もしあればローカル変数リストも)をリセットするには、コマンドM-x normal-modeを使用します。ファイルのモードを選択するを参照してください。