[61] [DFN[局所変数]]は [[Emacs]] の持つ状態の一種です。

* 公式情報

- [43] [CITE[Emacs]]
-- [1] 
[CITE@en[File Variables (GNU Emacs Manual)]], [TIME[2025-11-03T15:40:59.000Z]] <https://www.gnu.org/software/emacs/manual/html_node/emacs/File-Variables.html>
--
[6] 
[CITE@en[49.2.4 Local Variables in Files | Emacs Docs]], [TIME[2025-10-22T05:50:03.000Z]], [TIME[2025-11-03T14:55:39.803Z]] <https://emacsdocs.org/docs/emacs/File-Variables>
- [44] 
[CITE[XEmacs]]
-- [42] 
[CITE@en[XEmacs User's Manual: 27. Customization]], [TIME[2016-12-27T19:39:58.000Z]], [TIME[2025-11-03T15:48:20.441Z]] <https://www.xemacs.org/Documentation/21.5/html/xemacs_30.html>


* 局所変数

[2] [[Emacs]] には [DFN[local variable]] なる機構があります。
[SRC[>>6]]

[4] [[local variable]] は[[ファイル]]ごとに [DFN[file local variable]]
([DFN[file variable]])
として記述できます。
[SRC[>>6]]
[[file local variable]] は
[CODE[-*-]] 行や [[local variables list]]
によって設定できます。

[5] [[local variable]] は[[ディレクトリー]]ごとに [[directory variable]]
として記述できます。
[SRC[>>6]]
[[directory variable]] は[[ディレクトリー]]内に特定の[[ファイル名]]の[[ファイル]]を配置することによって設定できます。
[SEE[ [[directory variable]] ]]

* [CODE[-*-]] 行

[7] [DFN[[CODE[-*-]]]] [[行]]は、 [CODE[-*-]] ではじまり [CODE[-*-]]
で終わる記述を含めたものです。
[SRC[>>6, >>55]]

[8] 
[CODE[-*-]] の前や [CODE[-*-]] の後は無視されるようです。

;; [15] 従って[[プログラミング言語]]等の[[注釈]]として配置できます。

[9] 
[CODE[-*-]] が3つ[[以上]]含まれる場合の挙動はドキュメント上明らかではありません。

[10] 
[CODE[-*-]] の間は、 [CODE[;]] 区切りのリストと解釈されます。  [SRC[>>6, >>55]]

[12] 
末尾が [CODE[;]] でも構わないようです。 [SRC[>>6]]
あるいは空の項目があっても構わないのかもしれません。

[11] 
[CODE[;]] で区切られた各リスト項目は、名前と値を [CODE[:]]
で区切ったものです。 [SRC[>>6, >>55]]

[13] 
ドキュメント上は [CODE[:]] の後に1つ [CODE[ ]] ([[空白]]) が置かれています。
[CODE[;]] の後にも1つ [CODE[ ]] が置かれています。
先頭や末尾にも1つ [CODE[ ]] が置かれています。
[SRC[>>6, >>55]] どこまでが要件なのか明らかではありませんが、
名前と値と [CODE[:]] と [CODE[;]] の前後の[[空白]]の個数は任意であるようにも思われます。

[14] 
リスト項目に [CODE[:]] が2つ以上含まれる場合の挙動はドキュメント上明らかではありません。
最初のものが区切りで、それ以後は値の一部になるのでしょうか、
それともエラーとして無視されるのでしょうか。


[39] 
[CODE[mode]] のみを指定する [CODE[-*-]] では、
[CODE[mode:]] は省略できます
[SRC[>>42, >>38]]。


-*-*-

[17] 
[CODE[-*-]] [[行]]は、原則としてファイルの最初の[[行]]とします。
[SRC[>>6]]

[19] 
[[shebang]] がある場合、第2行とできます。 [SRC[>>6]]

[20] 
[[man page]] の [CODE['\"]] [[行]]がある場合、第2行とできます。 [SRC[>>6]]

;; [49] 
[[shebang]] と [CODE[-*-]] [[行]]が同じ[[行]]であっても構わないようです [SRC[>>3]]。
ただし [[shebang]] 側の処理で [CODE[-*-]] 以下も無視されませんから、
指定した[[命令]]に於いて適切に処置されることが前提になります。

[59] 
[[Ruby]] の[[魔法注釈]]の一種の [CODE[-*-]] 構文は、最初の[[行]]という制約はないように見えます。
ただし 
[[top-level magic comment]]
の
[CODE[encoding]] = [CODE[coding]] は最初の[[行]]または [[shebang]]
の次の[[行]]でなければならないようです [SRC[>>55]]。

;; [60] >>55 だと [[shebang]] が1行目で[[魔法注釈]]が2行目と限定されていますが、
古めのドキュメントだと [[shebang]] が1行目以外となる場合も説明されています。
[SEE[ [[-*- coding -*-]] ]]

[18] 
[[改行]]がないファイルの挙動はドキュメント上明らかではありません。

-*-*-

[16] この構文はかなり古く、 [CITE[Emacs]] の歴史の始まりの頃からあるらしいです。

[41] [CITE[Emacs]] 以外でもこれに対応したものは少なくありません。
ただし [CODE[coding]] に限る場合や、
特定の [CODE[mode]] に限る場合が多いようです。
[SEE[ [CODE[coding]] ]]

[56] [[Ruby]] は[[魔法注釈]]の構文の1つとして採用しています。
[SRC[>>55]]

[52] 
[CITE[Emacs]] の正式な用語ではないようですが、
[DFN[[RUBYB[モード行][modeline]]]]と呼ばれることがあります。

;; [53] 
同様の機能を[[モード行]]と呼ぶものもあります。
[SEE[ [[vim:]], [[Kate Modelines]] ]]

[50] 
[CITE[Emacs]] 以外の実装事例:

[REFS[

- [51] [CITE[TabMate - Make TextMate Respect Your Modelines]], [TIME[2014-08-02T16:21:28.000Z]], [TIME[2025-11-04T14:26:09.743Z]] <https://konstochvanligasaker.se/tabmate/>
-- [54] 
[CITE@en[TabMate (modeline support)]], [TIME[2024-01-29T22:47:56.000Z]], [TIME[2025-11-04T14:28:40.097Z]] <https://macromates.com/blog/2006/tabmate-modeline-support/>
- [55] 
[CITE@en[comments - Documentation for Ruby 3.5]], [TIME[2025-11-01T13:20:22.000Z]], [TIME[2025-11-04T14:56:10.209Z]] <https://docs.ruby-lang.org/en/master/syntax/comments_rdoc.html#label-Magic+Comments>

]REFS]


* 局所変数群リスト

[25] 
[DFN[local variables list]]
は、
[DFN[[CODE[Local Variables:]]]]
を含む[[行]]で始まり、
[DFN[[CODE[End:]]]]
を含む[[行]]で終わるものです。

[27] 
[CODE[Local Variables:]]
の前後には他の文字列があっても構いません。
それらは以後の行から除去されます。
[SRC[>>6]]

;; [28] 従って[[プログラミング言語]]等の[[注釈]]として記述できます。

[29] 除去が必須なのかどうか (除去するべきものがないとき何らかのエラーとして無視されたりするのか) 
ドキュメント上は明らかではありません。

[30] 除去対象の認識時や除去時に[[空白]]がどう扱われるのかドキュメント上は明らかではありません。
ドキュメント上の例文を見ると、余分な[[空白]]は柔軟に扱われていそうです。

[31] 
間の各[[行]]には名前と値を [CODE[:]] で区切って書きます。

[32] 
例文では [CODE[:]] の後には [CODE[ ]] ([[空白]]) が1個書かれています。
[[空白]]の配置にどれだけの柔軟性があるのかドキュメント上は明らかではありません。

[33] 
値の最後に [CODE[\]] を書くと次の[[行]]に値を続けることができます。
[SRC[>>6]]
[CODE[\]] と[[改行]]は値から除去されるようです。



[21] 
[[局所変数群リスト]]は、
ファイルの末尾に配置します。
ファイル末の3000字より前にあるべきではなく、
[CN[FORM FEED]] よりは後になければなりません。
[SRC[>>6]]

[26] [[局所変数群リスト]]が複数あるときの挙動はドキュメント上は明らかではありません。

* ファイル変数として記述できる特別な変数名

- [34] [CODE[mode]] は、 [[major mode]] を設定します。
[SRC[>>6]]
- [35] [CODE[eval]] は、 [[Lisp式]]を実行します。
[SRC[>>6]]
- [36] [CODE[coding]] [SEE[ [[-*- coding -*-]] ]]
- [37] [CODE[unibyte]] は、 [CODE[t]] が設定されたとき、
[[Emacs Lisp]] のファイルを [[unibyte mode]] 
で読み込みまたはコンパイルします。
[SRC[>>6]]


-*-*-

[57] 
[[Ruby]] は[[魔法注釈]]の構文として [CODE[-*-*]] を採用しています。
構文は [CITE[Emacs]] のものとよく似ていますが、
[CITE[Emacs]] の[[局所変数]]ではなく
[[Ruby]] の[[魔法注釈]]の[[指令]]の指定と解釈されます [SRC[>>55]]。

[58] 
[[指令]]の1つとして [CODE[encoding]] = [CODE[coding]] があります [SRC[>>55]]。
名前を [CODE[coding]] とし、値を [CITE[Emacs]] と [[Ruby]]
の共通のものを選べば、どちらにも対応できます。
[SEE[ [[-*- coding -*-]] ]]


* 処理

[22] 
[CODE[mode]] は、指定があり次第適用します。 [SRC[>>6]]

;; [23] [CODE[-*-]] [[行]]が先で[[局所変数群リスト]]が後で記述順、
ということと思われますが、ドキュメント上は明らかではありません。

[24] 
その後、
[CODE[mode]] 以外について、
まず [CODE[-*-]] [[行]]のものを適用し、
次に[[局所変数群リスト]]のものを適用します。
[SRC[>>6]]


[38] 特別なものを含め、同じ変数名を複数回記述することができるようです。
[CODE[mode]] や [CODE[eval]] によって設定過程が観測可能と思われます。



* 関連

[SEE[ [[テキストファイル]] ]]

[SEE[ [[sniffing]], [[コメントの中身が意味を持ってしまう]] ]]

[SEE[ [[vim:]] ]]

* メモ


[3] 
[CITE@en[File Local Variables in Emacs and Markdown Mode]], [TIME[2025-10-24T12:53:10.000Z]], [TIME[2025-11-03T15:41:42.741Z]] <https://jblevins.org/log/file-local-variables>


[40] 
一部では [DFN[Hey Emacs]] と呼ばれているようです。

[REFS[

- [45] [CITE@en[Hey Emacs - Wikipedia]], [TIME[2025-11-03T15:58:22.000Z]] <https://en.wikipedia.org/w/index.php?title=Hey_Emacs&oldid=601379518>
-- [47] [CITE@en[Talk:Hey Emacs - Wikipedia]], [TIME[2025-10-23T15:32:43.000Z]], [TIME[2025-11-03T15:59:13.835Z]] <https://en.wikipedia.org/wiki/Talk:Hey_Emacs>
-- [46] [CITE@it[Hey Emacs - Wikipedia]], [TIME[2025-10-20T15:55:04.000Z]], [TIME[2025-11-03T15:59:04.462Z]] <https://it.wikipedia.org/wiki/Hey_Emacs>
- [48] [CITE[null]], [TIME[1995-05-09T02:02:42.000Z]], [TIME[2025-11-03T15:59:19.996Z]] <https://dept-info.labri.fr/~strandh/Teaching/PFS/Common/Code-examples/emacs-20.4/nt/paths.h>

]REFS]




