大規模なソフトウェアプロジェクトのディレクトリツリーのように、特定のディレクトリとそのサブディレクトリにあるすべてのファイルに対して、同一のローカル変数セットを定義したい場合があります。これはディレクトリローカル変数を用いることで実現できます。ファイルローカル変数はディレクトリローカル変数を上書きするため、ディレクトリ内の一部のファイルに特殊な設定が必要な場合は、ディレクトリ変数でディレクトリ内の大半のファイルに対する設定を指定し、その上で、汎用的な設定を上書きする必要がある少数のファイルでファイルローカル変数を定義することができます。
ディレクトリローカル変数を定義する一般的な方法は、ディレクトリ内に .dir-locals.el36
という名前のファイルを置くことです。Emacs がそのディレクトリまたはそのサブディレクトリ内のファイルにアクセスするたびに、.dir-locals.el
で指定されたディレクトリローカル変数を、あたかもそのファイルのファイルローカル変数として定義されていたかのように適用します(ファイル内のローカル変数 を参照)。Emacs
は、アクセスしたファイルのディレクトリを起点として、ディレクトリツリーを遡りながら .dir-locals.el
を検索します。処理の遅延を防ぐため、リモートファイルではこの検索はスキップされます。必要に応じて、変数 enable-remote-dir-locals を t
に設定することで、リモートファイルに対しても検索範囲を拡張できます。
.dir-locals-2.el も使用可能です。.dir-locals.el と同じディレクトリにある場合、Emacs は .dir-locals.el に加えてこれを読み込みます。これは、.dir-locals.el が共有リポジトリでバージョン管理されており、個人のカスタマイズに利用できない場合に便利です。
.dir-locals.el ファイルには、メジャーモード名(シンボル)をアリリスト(The Emacs Lisp Reference Manual の Association Lists を参照)にマッピングする、特別に構成されたリストを記述する必要があります。各アリリストのエントリは、変数名と、指定されたメジャーモードが有効なときにその変数に代入されるディレクトリローカルな値で構成されます。モード名の代わりに ‘nil’ を指定することもでき、これはそのアリリストがあらゆるモードに適用されることを意味します。あるいは、サブディレクトリ(文字列)を指定することもでき、その場合はそのアリリストがそのサブディレクトリ内のすべてのファイルに適用されます。
以下は.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 ファイルで fill-column に使用される値は、モード名が prog-mode よりも具体的であるため、50
となります。prog-mode を継承するその他のモードを使用するファイルは、60 を使用します。narrow-files
ディレクトリ配下のファイルは、ディレクトリエントリがモードエントリよりも優先されるため、たとえ c-mode を使用していても 20
という値が使用されます。
.dir-locals.el 内で変数 eval
および unibyte
を指定でき、これらはファイルローカル変数における場合と同じ意味を持ちます。coding
はディレクトリローカル変数として指定できず、mode
は有効にするマイナーモードを指定します。ファイルローカル変数ではメジャーモードを指定する点が異なります。ファイル内のローカル変数 を参照してください。
.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
Interfaceを参照)を表示するコマンドもあります、customize-dirlocals。
ディレクトリローカル変数を指定するもう一つの方法は、dir-locals-set-class-variables 関数を用いて ディレクトリクラス に変数と値のペアのグループを定義し、次に 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, the Directory Editorを参照)においても有効になります。
MS-DOSでは、DOSファイルシステムの制約により、このファイルの名前は_dir-locals.elとする必要があります。ファイルシステムが8+3のファイル名に制限されている場合、ファイル名はOSによって_dir-loc.elに切り詰められます。