文件路径如何映射到.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

编辑:

正如乔纳森(Jonathan)所建议的那样,我也尝试过:

(;; 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)))

不幸的是,这些都不起作用。

Answers:


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'。也欢迎调试建议。
nert 2015年

我也尝试使用,add-dir-local-variable并且使用~/.dir-locals.el比我在问题中使用的语法更短的语法添加到("dev/test" (indent-tabs-mode))。不过仍然无法正常工作。
nert 2015年

我认为我的版本缺少一些括号,我已经添加了它们(与示例相比,它看起来有些过分,因此在subdir规范周围应该有多余的括号("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin 2015年

是的,行得通!现在唯一的问题是模式变量优先于目录变量,但是由于它们仅与c模式有关,因此我可以在初始化期间使用setq-default设置它们。非常感谢你。
nert 2015年

1
那很奇怪。我今天使用进行了测试((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil)))),它工作正常(提示将本地var设置为nil)。也许尝试将根目录中子目录规范之上的根目录设置为根目录,可能会将其设置为找到的最后一个值。
Jonathan Leech-Pepin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.