ファイルパスはどのように.dir-locals.elのサブディレクトリにマッピングされますか?


10

のアイデアが好きです.dir-locals.el.dir-locals.el自分のホームディレクトリに自分のファイルがあり、ファイルを開い.dir-locals.elたディレクトリに近い場合を除いて、開いたディレクトリ/ファイルのすべての変数を設定する必要があります。ただし、ファイルが認識されても、サブディレクトリのディレクトリ変数は開いているファイルに適用されます。

これは私の~/.dir-locals.elです:

(("dev/school" .
  ((indent-tabs-mode . nil)
   (c-basic-offset . 4)))
 ("dev/test" .
  ((indent-tabs-mode . nil)
   (c-basic-offset . 4)))
 (c-mode .
  ((c-file-style . "linux")
   (c-basic-offset . 8))))

ファイルを開くと~/dev/test/test.c、変数indent-tabs-modeはに設定されtc-basic-offset8ます。

(describe-variable 'c-basic-offset)そのファイルでは、8fromに設定されていることがわかります~/.dir-locals.el

(describe-variable 'indent-tabs-mode)そのファイルではt、その値()はデフォルトの状態にあると述べています。

どういうわけか望ましい動作を達成できますか?何が悪いのですか?ファイルパスはどのようにしてサブディレクトリにマッピングされ~/.dir-locals.elますか?

編集:

ジョナサンが示唆され、私も試してみました:

(;; dev/school subdir
 ("dev/school" .
  ;; dev/school specification for all modes
  (nil . ((indent-tabs-mode . nil)
          (c-basic-offset . 4)))))

さらにadd-dir-local-variable追加されたもの:

(("dev/school"
  (indent-tabs-mode)
  (c-basic-offset . 4)))

残念ながら、それらのいずれも機能しません。

回答:


7

マニュアルのドキュメントに基づいて、subdir仕様の一部が欠落しています。

サンプル.dir-locals.el

強調/明確化のためのコメント付きマニュアルから

(;; Dir settings
 (nil . ((indent-tabs-mode . t)
         (fill-column . 80)))
 (c-mode . ((c-file-style . "BSD")
            (subdirs . nil)))
 ;; Subdir specification
 ("src/imported" .
  ;; Subdir settings
  ((nil . ((change-log-default-name
            . "ChangeLog.local"))))))

修正された.dir-locals.el

これは、subdir仕様をすべてのモードに適用することを前提としています。あなただけそれらを適用したい場合はc-mode交換するnilc-modeモード仕様に。

(;; dev/school subdir
 ("dev/school" .
  ;; dev/school specification for all modes
  ((nil . ((indent-tabs-mode . nil)
           (c-basic-offset . 4)))))
 ;; dev/test subdir
 ("dev/test" .
  ;; dev/test specification for all modes
  ((nil . ((indent-tabs-mode . nil)
           (c-basic-offset . 4)))))
 ;; c-mode specification for dir + subdirs
 (c-mode .
  ((c-file-style . "linux")
   (c-basic-offset . 8))))

ドキュメントでその例を誤解しました。それを明確にしていただきありがとうございます。しかし、私はあなたのバージョン(コピー貼り付け)を試しましたが、それでも同じように動作します。「emacs -Q」を使用しても。デバッグの提案も歓迎します。
2015年

私も使用add-dir-local-variableしてみ~/.dir-locals.elましたが、質問で使用したよりも短い構文で追加されました:("dev/test" (indent-tabs-mode))。それでも動作しません。
2015年

私のバージョンにはいくつかの括弧が欠けていると思います、それらを追加しました(サンプルと比較して見直すと、サブディレクトリの仕様の周りに余分なものがあったはずです("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin

はい、うまくいきます!現在の唯一の問題は、モード変数がディレクトリ変数よりも優先されることですが、それらはcモードにのみ関連しているため、init中にsetq-defaultを使用して設定できます。どうもありがとうございました。
2015年

1
それは奇妙です。私は今日使用してテストを((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))行い、それは適切に機能しました(ローカル変数をnilに設定するように要求されました)。たぶん、リスト内のサブディレクトリ指定の上にルートのルートを配置してみてください。最後に見つかった値に設定する可能性があります。
Jonathan Leech-Pepin、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.