大きなソフトウェアプロジェクトでのディレクトリーツリーのような、特定のディレクトリーや、それのサブディレクトリーのすべてのファイルにたいして、同じローカル変数を定義したいことがあるかもしれません。これはディレクトリーローカル変数(directory-local variables)で行なうことができます。ファイルローカル変数はディレクトリーローカル変数をオーバーライドするので、あるディレクトリー内のファイルに特別なセッティングが必要な場合は、ディレクトリー変数でそのディレクトリー内の大多数にたいするセッティングを指定してから、ファイルローカル変数により、少数のファイルにたいしてオーバーライドを要する一般的なセッティングを定義できます。
ディレクトリーローカル変数を定義する通常の方法は、そのディレクトリーに.dir-locals.el24を配す方法です。そのディレクトリー、またはそれのサブディレクトリーの任意のファイルをEmacsがvisitするとき、.dir-locals.elで指定されたディレクトリーローカル変数が、あたかもそのファイルのファイルローカル変数(ファイル内のローカル変数を参照してください)として定義されたかのように、ファイルに適用されます。Emacsはvisitされたファイルのディレクトリーから、ディレクトリーツリーを上に移動しながら.dir-locals.elを検索します。スローダウンを避けるために、検索はリモートファイルをスキップします。必要なら、変数enable-remote-dir-locals
をt
にセットして、検索範囲をリモートファイルに広げることができます。
Emacsが追加でロードする.dir-locals-2.elが存在する場合は、それを使用することもできます。これは.dir-locals.elがバージョンコントロールの共有ディレクトリー配下にあり、個人的なカスタマイズに使用できないときに有用です。
.dir-locals.elは、特別な構成のリストをもちます。これはモード名(シンボルで指定)をalist(Association Lists: 連想リスト。Association Lists in The Emacs Lisp Reference Manualを参照してください)にマップします。各alistエントリーは、変数名と、指定されたメジャーモードが有効なときに、その変数に割り当てるディレクトリーローカル値からなります。モード名のかわりに‘nil’を指定でき、これはalistが任意のモードで適用されることを意味します。サブディレクトリー(文字列で指定)を指定することもできます。この場合、そのサブディレクトリーのすべてのファイルにalistが適用されます。
以下は、.dir-locals.elファイルの例です:
((nil . ((indent-tabs-mode . t) (fill-column . 80) (mode . auto-fill))) (c-mode . ((c-file-style . "BSD") (subdirs . nil))) ("src/imported" . ((nil . ((change-log-default-name . "ChangeLog.local"))))))
これはディレクトリーツリーの任意のファイルにたいして変数‘indent-tabs-mode’およびfill-column
をセットして、任意のCソースファイルにたいしてインデントスタイルをセットします。特別な要素mode
は有効にするマイナーモードを指定します。したがって(mode
.
auto-fill)え
はマイナーモードauto-fill-mode
の有効化が必要なことを指定します。特別な要素subdirs
は変数ではありません。これは特別なキーワードで、Cモードのセッティングがカレントディレクトリーだけに適用され、任意のサブディレクトリーには適用されないことを示します。最後に、これはsrc/importedサブディレクトリー内の任意のファイルにたいして、違うChangeLogファイル名を指定します。
異なるモード名やディレクトリーを使用する変数にたいして、.dir-locals.elファイル内に複数の値が含まれる場合には、汎用的なモードと比較してより特化したモードにたいする値が優先して適用されるでしょう。更にディレクトリー下に指定された値は、より高い優先度をもちます。たとえば:
((nil . ((fill-column . 40))) (c-mode . ((fill-column . 50))) (prog-mode . ((fill-column . 60))) ("narrow-files" . ((nil . ((fill-column . 20))))))
c-mode
はprog-mode
から派生しているので、c-mode
を使用するファイルはprog-mode
にもマッチします。しかしCのファイルはprog-mode
より特化したモード名なので、fill-column
に使用される値は50
になるでしょう。prog-mode
から派生する他のモードを使用するファイルは、60
を使用します。narrow-filesディレクトリー配下のファイルでは、モードエントリーよりディレクトリーエントリーが優先されるので、たとえc-mode
を使用するファイルでも、値20
が使用されることになります。
.dir-locals.el内ではmode
、eval
、unibyte
を指定できます。これらの変数は、ファイルローカル変数のときとオ同じ意味をもちます。coding
は、ディレクトリーローカル変数としては指定できません。ファイル内のローカル変数を参照してください。
.dir-locals.el内のスペシャルキーauto-mode-alist
で、ファイルのメジャーモードをセットできます。これは変数auto-mode-alist
と同様に機能します(ファイルのモードを選択するを参照)。たとえば以下はそのディレクトリー内の.defソースファイルをCモードにするようEmacsに指示する例です:
((auto-mode-alist . (("\\.def\\'" . c-mode))))
.dir-locals.elファイルを手で編集するかわりに、コマンドM-x add-dir-local-variableを使用できます。これはモード名またはサブディレクトリー、および変数名と値の入力を求め、ディレクトリーローカル変数を定義するエントリーを追加します。M-x delete-dir-local-variableは、エントリーを削除します。M-x copy-file-locals-to-dir-localsは、カレントファイル内のファイルローカル変数を.dir-locals.elにコピーして、.dir-locals-2.elがあれば同様にそのファイルにもコピーします。
3つのコマンドはすべて、プレフィクス引数を指定すると編集したいファイルの入力を求めます。存在する必要はないものの、.dir-locals.elか.dir-locals-2.elいずれかの有効なファイル名を入力しなければなりません。
ディレクトリーローカル変数を編集するためにEasy Customizationバッファー (Easy Customizationインターフェースを参照)をポップアップするコマンドcustomize-dirlocals
もあります。
ディレクトリーローカル変数を指定する他の方法は、dir-locals-set-class-variables
関数を使用して、ディレクトリークラス(directory
class)の中に、変数/値ペアーのグループを定義する方法です。その後、dir-locals-set-directory-class
関数を使用して、そのクラスに対応するディレクトリーをEmacsに指示します。これらの関数呼び出しは通常、初期化ファイルで行なわれます(Emacs初期化ファイルを参照してください)。この方法は、何らかの理由でディレクトリーに.dir-locals.elを置けないときに便利です。たとえば、この方法で書き込み不可なディレクトリーにセッティングを適用できます:
(dir-locals-set-class-variables 'unwritable-directory '((nil . ((some-useful-setting . value))))) (dir-locals-set-directory-class "/usr/include/" 'unwritable-directory)
変数にたいしてディレクトリーローカル値とファイルローカル値の両方が指定された場合、ファイルローカル値が効果をもちます。安全ではないディレクトリーローカル値は、安全でないファイルローカル値と同じ方法で扱われます(安全なファイル変数を参照してください)。
ディレクトリーローカル変数は、Diredバッファー(Dired (ディレクトリーエディター)を参照してください)のような、ファイルを直接visitしていないが、ディレクトリーで処理を行なうバッファーにたいしても効果があります。
MS-DOSでは、DOSファイルシステムの制限により、このファイルの名前は_dir-locals.elになります。ファイルシステムによりファイル名が8+3に制限されている場合、OSによりファイル名が_dir-loc.elに切り詰められるでしょう。