ディレクトリーは、そのディレクトリー内のすべてのファイルに共通なローカル変数値を指定することができます。Emacsはそのディレクトリー内の任意のファイルをvisitしているバッファー内で、それらの変数にたいするバッファーローカルなバインディングを作成するためにこれを使用します。これはそのディレクトリー内のファイルが何らかのプロジェクトに属していて、同じローカル変数を共有するときなどに有用です。
ディレクトリーローカル変数を指定するために2つの異なる方法があります: 1つは特別なファイルにそれを記述する方法、もう1つはそのディレクトリーにプロジェクトクラス(project class)を定義する方法です。
この定数はEmacsがディレクトリーローカル変数を見つけることができると期待するファイルの名前。ファイル名は.dir-locals.el12。ディレクトリー内でその名前をもつファイルによりEmacsはディレクトリー内の任意のファイル、または任意のサブディレクトリー(オプションでサブディレクトリーを除外できる。以下参照)にセッティングを適用する。独自に.dir-locals.elをもつサブディレクトリーがある場合には、Emacsはサブディレクトリーで見つかったもっとも深いファイルのディレクトリーからディレクトリーツリーを上方に移動しながら、もっとも深いファイルのセッティングを使用する。この定数は2番目のdir-localsファイル.dir-locals-2.elの名前を導出するためにも使用される。この2番目のdir-localsファイルが与えられた場合には、そのファイルが.dir-locals.elに加えてロードされる。これは.dir-locals.elがバージョンコントロールの共有レポジトリの配下にあって個人のカスタマイズ用に使用できないときに有用。このファイルはローカル変数をフォーマットされたリストとして指定する。詳細はPer-directory Local Variables in The GNU Emacs Manualを参照のこと。
この関数は.dir-locals.el
ファイルを読み込み、そのディレクトリー内の任意のファイルをvisitしているバッファーにローカルなfile-local-variables-alist
内に、それらを適用することなくディレクトリーローカル変数を格納する。この関数はディレクトリーローカルなセッティングもdir-locals-class-alist
(.dir-locals.elファイルが見つかったディレクトリーにたいする特別なクラスを定義する)内に格納する。この関数は以下で説明するように、dir-locals-set-class-variables
とdir-locals-set-directory-class
を呼び出すことにより機能する。
この関数はディレクトリーローカル変数を探して、即座にそれらをカレントバッファーに適用する。これはDiredバッファーのような、非ファイルバッファーをディレクトリーローカル変数のセッティングにしたがわせるために、モードコマンド呼び出しの中から呼び出されることを意図したものである。非ファイルバッファーにたいしては、Emacsはdefault-directory
とその親ディレクトリーの中から、ディレクトリーローカル変数を探す。
この関数は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つを指定する。
この関数はdirectory
とサブディレクトリー内のすべてのファイルにclassを割り当てる。その後、classにたいして指定されたすべての変数セッティングは、directoryとその子ディレクトリー内でvisitされたすべてのファイルに適用される。classは事前にdir-locals-set-class-variables
で定義されていなければならない。
Emacsが.dir-locals.el
ファイルからディレクトリー変数をロードする際、内部的にこの関数を使用する。その場合、オプションの引数mtimeはファイルの修正日時(modification
time。file-attributes
によりリターンされる)を保持する。Emacsは記憶されたローカル変数がまだ有効化チェックするために、この日時を使用する。ファイルを介さず直接クラスを割り当てる場合、この引数はnil
になる。
このalistはクラスシンボル(class
symbol)とそれに関連づけられる変数のセッティングを保持する。これはdir-locals-set-class-variables
により更新される。
このalistはディレクトリー名、それらに割り当てられたクラス名、およびこのエントリーに関連するディレクトリーローカル変数ファイルの修正日時を保持する。関数dir-locals-set-directory-class
はこのlistを更新する。
このスペシャルフックは与えられたバッファーに使用するディレクトリーローカル変数を収集する関数を保持している。デフォルトではこのセクションで説明する別の設定にしたがう関数だけが含まれている。しかし他のテキストエディターで用いられているセッティングのような、より多くのディレクトリーローカル変数ソースにたいするサポートの追加にこのフックを使用できる。
このフックの関数はディレクトリーローカル変数の適用を意図するバッファーにおいて、major-mode
やbuffer-file-name
のような情報源を用いてディレクトリーローカル変数を適用する変数を見つけられるように、バッファーのメジャーモード関数の実行後に引数なしで呼び出される。
フックの関数は(directory
.
alist)
という形式のコンスセル、あるいはこのようなコンスセルのリストをリターンすること。リターン値のnil
はディレクトリーローカル変数が見つからなかったことを意味する。directoryは変数を適用するディレクトリー名を表す文字列、alistはそれぞれ(varname
. value)
という形式をもち、カレントバッファーに適用する変数と値を表すような要素からなるリストであること。
この関数によってリターンされるさまざまなalistは結合されて、その結果競合が生じた場合にはディレクトリー階層でより深いディレクトリーのセッティングが上位ディレクトリーのセッティングよりも優先される。最後にこのフックはファイルをvisitするたびに実行されるので、関数を効率的に保つよう試みることが重要であり、それには通常ある種のキャッシングが必要となる。
nil
ならディレクトリーローカル変数は無視される。この変数はファイルローカル変数(ファイルローカル変数を参照)にはしたがうが、ディレクトリーローカル変数は無視したいモードにたいして有用かもしれない。