在 emacs 中设置每个项目的缩进变量

Setting per-project indent variables in emacs

我的 emacs 设置为全局使用 2 个空格进行缩进:

(setq-default indent-tabs-mode nil)
(setq tab-width 2)
(setq js-indent-level 2)
(setq css-indent-offset 2)

但我想为使用 4 个空格进行缩进的 Web 项目(主要是 html、css 和 js)做贡献。所以我试图在项目目录中设置一个 .dir-locals.el 文件。该文件具有以下设置(使用 add-dir-local-variable 命令添加):

((nil . ((tab-width . 4)
         (js-indent-level . 4)))

;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.

((js-mode
  (tab-width . 4)))
;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.

((js-mode
  (js-indent-level . 4)))
;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.

((html-mode
  (tab-width . 4)))

但是这些设置没有生效。当我在项目子目录中打开 .js 或 .html 文件时,按 Tab 键会缩进 2 个空格。

我做错了什么?

首先,您的 .dir-locals.el 数据不平衡 (M-x check-parens)。

我不确定那是怎么发生的,但如果你能让 Emacs 做到这一点,那么你应该 M-x report-emacs-bug。我假设它来自手动编辑。

我不确定 多个 js-mode 项目是否有效。也许这很好,但这似乎很不寻常。 (不过,可能 Emacs 被不平衡的括号弄糊涂了。)

这是您的文件重写后使用更常见的(或至少有记录的)点对符号:

((nil . ((tab-width . 4)
         (js-indent-level . 4)))

 (js-mode . ((tab-width . 4)
             (js-indent-level . 4)))

 (html-mode . ((tab-width . 4))))

请注意(对于此特定数据)您不需要 js-modehtml-mode 条目,因为它们复制了 nil 模式条目的默认值。

编辑: 根据实验,一旦文件处于有效状态,add-dir-local-variable 似乎会按预期运行。

它更喜欢在可能的情况下创建更紧凑的列表符号——这很好;它们是等价的——但了解格式差异很有用。
参见 C-hig (elisp) Dotted Pair Notation RET