Previous: File Variables, Up: Variables [Contents][Index]
大きなソフトウェアプロジェクトでのディレクトリーツリーのような、特定のディレクトリーや、それのサブディレクトリーのすべてのファイルにたいして、同じローカル変数を定義したいことがあるかもしれません。これはディレクトリーローカル変数(directory-local variables)で行なうことができます。
ディレクトリーローカル変数を定義する通常の方法は、そのディレクトリーに.dir-locals.el20というファイルを置く方法です。そのディレクトリー、またはそれのサブディレクトリーの任意のファイルをEmacsがvisitするとき、.dir-locals.elで指定されたディレクトリーローカル変数が、あたかもそのファイルのファイルローカル変数(File Variablesを参照してください)として定義されたかのように、ファイルに適用されます。Emacsはvisitされたファイルのディレクトリーから、ディレクトリーツリーを上に移動しながら.dir-locals.elを検索します。スローダウンを避けるために、検索はリモートファイルをスキップします。必要なら、変数enable-remote-dir-locals
をt
にセットして、検索範囲をリモートファイルに広げることができます。
.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ファイルを手で編集するかわりに、コマンド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に切り詰められるでしょう。