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

3

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

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

但我想为一个使用4个空格缩进的网页项目(主要是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个空格的缩进。

我做错了什么?


你的文件是本地的还是通过 TRAMP 等远程编辑工具进行编辑的? - Chris
它们是本地机器的。 - azangru
如果您在打开适当的文件后(例如 C-h v js-indent-level RET),检查变量,您得到的是4还是2? - Chris
这是我的输出:js-indent-level的值为2 原始值为4 - azangru
你确定正在使用 js-modehtml-mode,而不是其他什么(例如 js2-modeweb-mode)? - Chris
1
是的 :-) 我注意到了一些奇怪的事情:当我在这个目录中打开文件时,迷你缓冲区会显示一个消息:“读取dir-locals时出错:(文件结束)”。这可能与问题有关吗? - azangru
1个回答

5

首先,你的.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

1
谢谢!现在emacs已经按照我想要的方式缩进javascript了。但是html的缩进没有改变为4个空格。所以,在一些搜索之后,我在html-mode中添加了以下设置:(sgml-basic-offset . 4)。它可以工作,但是每次我尝试打开一个html文件时,emacs都会说“本地变量列表包含可能不安全的值”,并将sgml-basic-offset: 4标记为此类值。你是否知道任何更好的方法来设置html-mode的缩进? - azangru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接