12.13 ディレクトリーローカル変数

ディレクトリーは、そのディレクトリー内のすべてのファイルに共通なローカル変数値を指定することができます。Emacsはそのディレクトリー内の任意のファイルをvisitしているバッファー内で、それらの変数にたいするバッファーローカルなバインディングを作成するためにこれを使用します。これはそのディレクトリー内のファイルが何らかのプロジェクトに属していて、同じローカル変数を共有するときなどに有用です。

ディレクトリーローカル変数を指定するために2つの異なる方法があります: 1つは特別なファイルにそれを記述する方法、もう1つはそのディレクトリーにプロジェクトクラス(project class)を定義する方法です。

Constant: dir-locals-file

This constant is the name of the file where Emacs expects to find the directory-local variables. The name of the file is .dir-locals.el12. A file by that name in a directory causes Emacs to apply its settings to any file in that directory or any of its subdirectories (optionally, you can exclude subdirectories; see below). If some of the subdirectories have their own .dir-locals.el files, Emacs uses the settings from the deepest file it finds starting from the file’s directory and moving up the directory tree. This constant is also used to derive the name of a second dir-locals file .dir-locals-2.el. If this second dir-locals file is present in the same directory as .dir-locals.el, then it will be loaded in addition to .dir-locals.el. This is useful when .dir-locals.el is under version control in a shared repository and cannot be used for personal customizations. The file specifies local variables as a specially formatted list; see Per-directory Local Variables in The GNU Emacs Manual, for more details.

Function: hack-dir-local-variables

この関数は.dir-locals.elファイルを読み込み、そのディレクトリー内の任意のファイルをvisitしているバッファーにローカルなfile-local-variables-alist内に、それらを適用することなくディレクトリーローカル変数を格納する。この関数はディレクトリーローカルなセッティングもdir-locals-class-alist(.dir-locals.elファイルが見つかったディレクトリーにたいする特別なクラスを定義する)内に格納する。この関数は以下で説明するように、dir-locals-set-class-variablesdir-locals-set-directory-classを呼び出すことにより機能する。

Function: hack-dir-local-variables-non-file-buffer

この関数はディレクトリーローカル変数を探して、即座にそれらをカレントバッファーに適用する。これはDiredバッファーのような、非ファイルバッファーをディレクトリーローカル変数のセッティングにしたがわせるために、モードコマンド呼び出しの中から呼び出されることを意図したものである。非ファイルバッファーにたいしては、Emacsはdefault-directoryとその親ディレクトリーの中から、ディレクトリーローカル変数を探す。

Function: dir-locals-set-class-variables class variables

この関数はclassという名前がつけられたシンボルにたいして一連の変数セッティングを定義する。その後はこのクラスを1つ以上のディレクトリーに割り当てることができるので、Emacsはこれらの変数セッティングをディレクトリー内のすべてのファイルに適用する。variables内のリストは2つの形式 — (major-mode . alist)、または(directory . list) — のうちのいずれかをもつことができる。1番目の形式ではそのファイルのバッファーがmajor-modeを継承するモードに切り替わるときに、連想リストalist内のすべての変数が適用される。alist(name . value)という形式。major-modeにたいする特別な値nilは、そのセッティングが任意のモードに適用できることを意味する。alist内では特別なnameとしてsubdirsを使用することができる。連想値がnilならalistは関連するディレクトリー内のファイルだけに適用されて、それらのサブディレクトリーには適用されない。

variablesの2番目の形式では、directoryがそのファイルのディレクトリーの最初のサブディレクトリーなら、上記のルールにしたがいlistが再帰的に適用される。listはこの関数のvariablesで指定できる2つの形式のうち1つを指定する。

Function: dir-locals-set-directory-class directory class &optional mtime

この関数はdirectoryとサブディレクトリー内のすべてのファイルにclassを割り当てる。その後、classにたいして指定されたすべての変数セッティングは、directoryとその子ディレクトリー内でvisitされたすべてのファイルに適用される。classは事前にdir-locals-set-class-variablesで定義されていなければならない。

Emacsが.dir-locals.elファイルからディレクトリー変数をロードする際、内部的にこの関数を使用する。その場合、オプションの引数mtimeはファイルの修正日時(modification time。file-attributesによりリターンされる)を保持する。Emacsは記憶されたローカル変数がまだ有効化チェックするために、この日時を使用する。ファイルを介さず直接クラスを割り当てる場合、この引数はnilになる。

Variable: dir-locals-class-alist

このalistはクラスシンボル(class symbol)とそれに関連づけられる変数のセッティングを保持する。これはdir-locals-set-class-variablesにより更新される。

Variable: dir-locals-directory-cache

このalistはディレクトリー名、それらに割り当てられたクラス名、およびこのエントリーに関連するディレクトリーローカル変数ファイルの修正日時を保持する。関数dir-locals-set-directory-classはこのlistを更新する。

Variable: hack-dir-local-get-variables-functions

このスペシャルフックは与えられたバッファーに使用するディレクトリーローカル変数を収集する関数を保持している。デフォルトではこのセクションで説明する別の設定にしたがう関数だけが含まれている。しかし他のテキストエディターで用いられているセッティングのような、より多くのディレクトリーローカル変数ソースにたいするサポートの追加にこのフックを使用できる。

このフックの関数はディレクトリーローカル変数の適用を意図するバッファーにおいて、major-modebuffer-file-nameのような情報源を用いてディレクトリーローカル変数を適用する変数を見つけられるように、バッファーのメジャーモード関数の実行後に引数なしで呼び出される。

フックの関数は(directory . alist)という形式のコンスセル、あるいはこのようなコンスセルのリストをリターンすること。リターン値のnilはディレクトリーローカル変数が見つからなかったことを意味する。directoryは変数を適用するディレクトリー名を表す文字列、alistはそれぞれ(varname . value)という形式をもち、カレントバッファーに適用する変数と値を表すような要素からなるリストであること。

この関数によってリターンされるさまざまなalistは結合されて、その結果競合が生じた場合にはディレクトリー階層でより深いディレクトリーのセッティングが上位ディレクトリーのセッティングよりも優先される。最後にこのフックはファイルをvisitするたびに実行されるので、関数を効率的に保つよう試みることが重要であり、それには通常ある種のキャッシングが必要となる。

Variable: enable-dir-local-variables

nilならディレクトリーローカル変数は無視される。この変数はファイルローカル変数(ファイルローカル変数を参照)にはしたがうが、ディレクトリーローカル変数は無視したいモードにたいして有用かもしれない。


Footnotes

(12)

The MS-DOS version of Emacs uses _dir-locals.el instead, due to limitations of the DOS filesystems.


This page has generated for branch:work/emacs-30_8ac894e2246f25d2a2a97d866b10e6e0b0fede5a, commit:b7b3c5b81a7a4eec61faa3ed3d7c731d52d3987b to check Japanese translation.