Next: , Up: ファイル内のローカル変数   [Contents][Index]


50.2.4.1 ファイル変数の指定

ファイルローカル変数を指定するには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の他に、ファイル変数として特別な意味をもつキーワードはcodingunibyteevalです。これらは以下で説明します。

シェルスクリプトでは、最初の行はスクリプトのインタープリターの識別に使用されるので、ローカル変数をそこに置くことはできません。これに対処するために、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:

いくつかの名前は、ローカル変数リスト内で特別な意味をもちます:

これら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を使用します。ファイルのモードを選択するを参照してください。