无法更改Emacs在HTML标签之间的默认缩进

13

我对Emacs缩进范例感到困惑。

我在我的.emacs文件中有以下内容:

(setq-default tab-width 4)

如果我在以下情况下按下TAB键
                    <ul>
(caret)
                    </ul>

最终结果如下

                   <ul>
                     (caret)
                   </ul>

(在HTML标签之间加入两个空格缩进。)

最终应该像这样:

                   <ul>
                       (caret)
                   </ul>

我尝试了各种方法:

(setq-default tab-width 4)
(setq-default indent-tabs-mode t)
(setq tab-stop-list '(4 8 12 16))

我已经将所有可能的Emacs缩进设置都设置为4,但仍然存在2个空格的缩进。有什么建议吗?

你正在使用哪种模式来编辑HTML? - Noufal Ibrahim
我不确定。我猜这是默认模式(当Emacs打开一个以.html扩展名结尾的文件时,我以为它会切换到HTML模式)。 - alexchenco
1个回答

24

在这种情况下,设置制表位宽度不适用,但我理解你的困惑;Emacs提供了几个与制表符相关的变量,为特定的场景确定正确的变量可能会令人困惑。

这篇EmacsWiki文章提供了有关设置HTML缩进级别的更多细节;总的来说,EmacsWiki是一个很好的Emacs提示资源。

在这种情况下,由于您正在使用Emacs的标准HTML模式(html-mode,由sgml-mode定义),所以要设置的变量是sgml-basic-offset。该变量默认为2,但可以按以下方式将其更改为4:

(setq sgml-basic-offset 4)

如果你想将这个更改仅应用于html-mode,可以使用以下代码:

(add-hook 'html-mode-hook
  (lambda ()
    ;; Default indentation is usually 2 spaces, changing to 4.
    (set (make-local-variable 'sgml-basic-offset) 4)))

这一切都基于您使用的是Emacs 22或更高版本; 如果不是这种情况,那么我链接到的EmacsWiki页面包含了早期Emacs版本的解决方法。


它起作用了,谢谢!我很好奇为什么不使用:(setq html-basic-offset 4)? - alexchenco
2
HTML是SGML的一个派生版本。html-mode的Emacs功能由通用的SGML包提供,这就是为什么变量是sgml-basic-offset。因此,在html-mode-hook中设置该变量更好;这样,它只会影响HTML文件,而不会影响一般的SGML文件。 - Emerick Rogul
这取决于您用于编辑HTML代码的模式。实际上并没有真正的“默认值”。 - Noufal Ibrahim
在25.2.2中尝试过这个。第二段代码片段不起作用,而第一段可以。 - Magitrek
以上代码可以运行,但是应该把“html”替换为“mhtml”。 - baz

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