1行目でローカル変数を指定する方法の一例を以下に示します。
-*- mode: modename; var: value; ... -*-
この方法で、任意の数の変数/値ペアを指定でき、各ペアはコロンとセミコロンで区切られます。特殊な変数/値ペア mode: modename;
が存在する場合、メジャーモード(「-mode」サフィックスなし)を指定します。value
はリテラルとして扱われ、評価されません。
以下は、Lispモードを指定し、2つの変数に数値を設定する1行目の例です。
;; -*- mode: Lisp; fill-column: 75; comment-column: 50; -*-
‘-*-’ 行に変更を加えた後は、M-x normal-mode と入力して再解釈してください。ファイルモードの選択を参照してください。
mode 以外に、ファイル変数として特別な意味を持つキーワードには、coding、unibyte、eval があります。 これらのキーワードについては後述します。
シェルスクリプトでは、1行目がスクリプトインタプリタの指定に使用されるため、そこにローカル変数を置くことはできません。これに対応するため、Emacsは1行目でインタプリタが指定されている場合、2行目でローカル変数を探します。これは、troffプリプロセッサのリストを指定するためのマジック文字列 ‘'\"’ で始まるmanページについても同様です(ただし、すべてがそうであるわけではありません)。
手動でエントリを追加する代わりに、M-x add-file-local-variable-prop-line を使用できます。このコマンドは変数と値の入力を求め、それらを適切な形式で1行目に追加します。M-x delete-file-local-variable-prop-line コマンドは変数の入力を求め、そのエントリを行から削除します。ディレクトリローカル変数(ディレクトリごとのローカル変数を参照)がある場合、M-x copy-dir-locals-to-file-locals-prop-line コマンドはそれらを1行目にコピーします。
また、ファイルの末尾付近にローカル変数リストを記述することで、ファイルローカル変数を定義することもできます。
ローカル変数のリストは、文字列 ‘Local Variables:’ を含む行で始まり、文字列 ‘End:’ を含む行で終わります。その間には、次のように変数名と値が1セットずつ1行に記述されます:
/* Local Variables: */ /* mode: c */ /* comment-column: 0 */ /* End: */
この例では、各行は接頭辞 ‘/*’ で始まり、接尾辞 ‘*/’ で終わっています。Emacsは、リストの1行目にあるマジック文字列 ‘Local Variables:’ を挟む形で接頭辞と接尾辞を検出して認識し、その後、リストの他の行からはそれらを自動的に除外します。接頭辞や接尾辞を用いる一般的な理由は、ローカル変数のリストをコメント内に埋め込むことで、ファイルの想定対象である他のプログラムを混乱させないようにするためです。上記の例はC言語向けのもので、コメントは ‘/*’ で始まり、‘*/’ で終わります。
ローカル変数リストの開始位置は、ファイル末尾から3000文字以内でなければならず、またファイルがページ分けされている場合は最終ページに配置する必要があります。無関係なテキストがEmacsにローカル変数リストのように見えてしまう場合は、そのテキストの後にフォームフィード文字(ページ区切り文字、Pagesを参照)を挿入することで、それを回避できます。
ローカル変数に変更を加えた後は、M-x normal-mode と入力して再読み込みしてください。ファイルモードの選択を参照してください。
‘-*-’ という行と同様に、ローカル変数リスト内の変数はリテラルとして扱われ、事前に評価されることはありません。長い文字列値をファイル内の複数行にわたって記述したい場合は、Lispの文字列定数では無視されるバックスラッシュ+改行を使用できます。リストの処理時に接頭辞と接尾辞は取り除かれるため、文字列の途中で始まる行や終わる行であっても、各行にそれらを付ける必要があります。以下に例を示します。
# Local Variables: # compile-command: "cc foo.c -Dfoo=bar -Dhack=whatever \ # -Dmumble=blaah" # End:
ローカル変数リストを直接入力する代わりに、M-x add-file-local-variable コマンドを使用できます。このコマンドは変数と値の入力を求め、それらをリストに追加し、必要に応じて ‘Local Variables:’ という文字列と開始・終了マーカーを付加します。M-x delete-file-local-variable コマンドはリストから変数を削除します。M-x copy-dir-locals-to-file-locals はディレクトリローカル変数をリストにコピーします(ディレクトリごとのローカル変数を参照)。
ローカル変数リストにおいて、特別な意味を持つ名前があります:
mode は、指定されたメジャーモードを有効にします。
eval は、指定された Lisp 式を評価します(その式が返す値は無視されます)。
coding は、このファイルの文字コード変換に使用する符号化方式を指定します。符号化方式を参照してください。
unibyte は、値が t
の場合に、Emacs Lisp ファイルをユニバイトモードでロードまたはコンパイルすることを指定します。GNU
Emacs Lisp Reference Manual の マルチバイト文字の無効化
を参照してください。
これら4つのキーワードは厳密には変数ではなく、他の文脈で設定しても特別な意味はありません。
複数のEmacsバージョンにわたってファイルを編集しており、より新しいEmacsバージョンのファイルを扱うための新しいモードが導入された場合、いくつかのmodeエントリを使用して、新しいEmacsでは新モード(my-new-modeと呼ぶ)を利用し、古いEmacsバージョンでは旧モード(my-old-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
キーワードを使用しないでください。ローカル変数リストでマイナーモードを有効化または無効化するには、モードコマンドを実行する Lisp 式とともに
eval キーワードを使用してください(マイナーモード を参照)。例えば、以下のローカル変数リストでは、引数なしで eldoc-mode を呼び出すことで ElDoc モード(プログラミング言語ドキュメントの検索 を参照)を有効にし(引数に 1
を指定して呼び出しても同様です)、引数に −1 を指定して font-lock-mode
を呼び出すことで Font Lock モード(Font Lock
モード を参照)を無効にします。
;; Local Variables: ;; eval: (eldoc-mode) ;; eval: (font-lock-mode -1) ;; End:
ただし、マイナーモードをこのように指定するのは誤りであることが多い点に注意してください。マイナーモードは個々のユーザーの好みを表すものであり、ファイルを編集する可能性のある他のユーザーに自分の好みを押し付けるのは不適切かもしれません。状況に応じてマイナーモードを自動的に有効または無効にしたい場合は、メジャーモードフック(Hooksを参照)で実装する方が適切な場合が多いです。