Next: , Previous: , Up: 変数   [Contents][Index]


50.2.5 ディレクトリーごとのローカル変数

大きなソフトウェアプロジェクトでのディレクトリーツリーのような、特定のディレクトリーや、それのサブディレクトリーのすべてのファイルにたいして、同じローカル変数を定義したいことがあるかもしれません。これはディレクトリーローカル変数(directory-local variables)で行なうことができます。ファイルローカル変数はディレクトリーローカル変数をオーバーライドするので、あるディレクトリー内のファイルに特別なセッティングが必要な場合は、ディレクトリー変数でそのディレクトリー内の大多数にたいするセッティングを指定してから、ファイルローカル変数により、少数のファイルにたいしてオーバーライドを要する一般的なセッティングを定義できます。

ディレクトリーローカル変数を定義する通常の方法は、そのディレクトリーに.dir-locals.el24を配す方法です。そのディレクトリー、またはそれのサブディレクトリーの任意のファイルをEmacsがvisitするとき、.dir-locals.elで指定されたディレクトリーローカル変数が、あたかもそのファイルのファイルローカル変数(ファイル内のローカル変数を参照してください)として定義されたかのように、ファイルに適用されます。Emacsはvisitされたファイルのディレクトリーから、ディレクトリーツリーを上に移動しながら.dir-locals.elを検索します。スローダウンを避けるために、検索はリモートファイルをスキップします。必要なら、変数enable-remote-dir-localstにセットして、検索範囲をリモートファイルに広げることができます。

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-modeprog-modeから派生しているので、c-modeを使用するファイルはprog-modeにもマッチします。しかしCのファイルはprog-modeより特化したモード名なので、fill-columnに使用される値は50になるでしょう。prog-modeから派生する他のモードを使用するファイルは、60を使用します。narrow-filesディレクトリー配下のファイルでは、モードエントリーよりディレクトリーエントリーが優先されるので、たとえc-modeを使用するファイルでも、値20が使用されることになります。

.dir-locals.el内ではmodeevalunibyteを指定できます。これらの変数は、ファイルローカル変数のときとオ同じ意味をもちます。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-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していないが、ディレクトリーで処理を行なうバッファーにたいしても効果があります。


Footnotes

(24)

MS-DOSでは、DOSファイルシステムの制限により、このファイルの名前は_dir-locals.elになります。ファイルシステムによりファイル名が8+3に制限されている場合、OSによりファイル名が_dir-loc.elに切り詰められるでしょう。