Previous: File Variables, Up: Variables [Contents][Index]
大きなソフトウェアプロジェクトでのディレクトリーツリーのような、特定のディレクトリーや、それのサブディレクトリーのすべてのファイルにたいして、同じローカル変数を定義したいことがあるかもしれません。これはディレクトリーローカル変数(directory-local variables)で行なうことができます。ファイルローカル変数はディレクトリーローカル変数をオーバーライドするので、あるディレクトリー内のファイルに特別なセッティングが必要な場合は、ディレクトリー変数でそのディレクトリー内の大多数にたいするセッティングを指定してから、ファイルローカル変数により、少数のファイルにたいしてオーバーライドを要する一般的なセッティングを定義できます。
ディレクトリーローカル変数を定義する通常の方法は、そのディレクトリーに.dir-locals.el22を配す方法です。そのディレクトリー、またはそれのサブディレクトリーの任意のファイルをEmacsがvisitするとき、.dir-locals.elで指定されたディレクトリーローカル変数が、あたかもそのファイルのファイルローカル変数(File Variablesを参照してください)として定義されたかのように、ファイルに適用されます。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))) (c-mode . ((c-file-style . "BSD") (subdirs . nil))) ("src/imported" . ((nil . ((change-log-default-name . "ChangeLog.local"))))))
これはディレクトリーツリーの任意のファイルにたいして、‘indent-tabs-mode’とfill-column
をセットし、任意のCソースファイルにたいしてインデントスタイルをセットします。特別な要素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
は、ディレクトリーローカル変数としては指定できません。File Variablesを参照してください。
.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-set-class-variables
関数を使用して、ディレクトリークラス(directory
class)の中に、変数/値ペアーのグループを定義する方法です。その後、dir-locals-set-directory-class
関数を使用して、そのクラスに対応するディレクトリーをEmacsに指示します。これらの関数呼び出しは通常、初期化ファイルで行なわれます(Init Fileを参照してください)。この方法は、何らかの理由でディレクトリーに.dir-locals.elを置けないときに便利です。たとえば、この方法で書き込み不可なディレクトリーにセッティングを適用できます:
(dir-locals-set-class-variables 'unwritable-directory '((nil . ((some-useful-setting . value))))) (dir-locals-set-directory-class "/usr/include/" 'unwritable-directory)
変数にたいしてディレクトリーローカル値とファイルローカル値の両方が指定された場合、ファイルローカル値が効果をもちます。安全ではないディレクトリーローカル値は、安全でないファイルローカル値と同じ方法で扱われます(Safe File Variablesを参照してください)。
ディレクトリーローカル変数は、Diredバッファー(Diredを参照してください)のような、ファイルを直接visitしていないが、ディレクトリーで処理を行なうバッファーにたいしても効果があります。
MS-DOSでは、DOSファイルシステムの制限により、このファイルの名前は_dir-locals.elになります。ファイルシステムによりファイル名が8+3に制限されている場合、OSによりファイル名が_dir-loc.elに切り詰められるでしょう。