Emacs xml模式缩进,带有选项卡

时间:2013-08-08 09:25:42

标签: xml emacs indentation sgml

我拼命尝试使用制表符而不是空格来制作我的emacs xml(sgml?)模式缩进。 到目前为止我尝试了什么:

(defun my-xml-hook ()
  (setq c-tab-always-indent t
        tab-width 4
        indent-tabs-mode t) ; use tabs for indentation
  (setq indent-line-function 'insert-tab)
)
(add-hook 'xml-mode-hook 'my-xml-hook)
(defun local-sgml-mode-hook
  (setq fill-column 70
        indent-tabs-mode t
        next-line-add-newlines nil
        sgml-indent-data t)
  (auto-fill-mode t)
  (setq indent-line-function 'insert-tab)
  )
(add-hook 'psgml-mode-hook '(lambda () (local-psgml-mode-hook)))

没有任何效果,编辑* .xml文件时,仍会在2个空格(emacs23和emacs24)中出现缩进。

请注意,我也有

(setq indent-tabs-mode nil)

在我的.emacs文件中,但是之后应该调用钩子,所以应该覆盖它。

如何强制emacs缩进* .xml文件中的标签?为什么我的钩子不工作?

2 个答案:

答案 0 :(得分:7)

(c-)tab-always-indent控制击中TAB键的内容,而不是插入的内容。

indent-line-function设置为insert-tab会让您失去模式的智能缩进。

如果您使用的是现代emacs,则可能使用的是nxml-mode而不是xml-mode。在这种情况下,nxml-mode-hook应该是您应该(setq indent-tabs-mode t)进行的。

如果您使用的是默认sgml模式,那么sgml-mode-hook应该是应该完成的(setq indent-tabs-mode t)(在您正在使用的代码段psgml-mode-hook中)

(tab-always-indent和indent-line-function可以保留默认状态)

修改

总结以下对话:变量nxml-child-indent不应小于tab-width

(并且由于这些变量的默认emacs值是2和8,因此使用emacs中的选项卡配置emacs以缩进XML比应该更难)

答案 1 :(得分:2)

nxml-mode使用标签花了我很长时间。我最终使用了smart-tabs-mode,它提供了一个简洁的解决方案。对于它的价值,这是我最终确定的配置:

;; indentation using smart-tabs-mode
(setq-default tab-width 4)
(smart-tabs-insinuate 'c 'c++ 'java 'javascript 'cperl 'python 'ruby 'nxml)

;; nxml-mode
(setq 
    nxml-child-indent 4
    nxml-attribute-indent 4
    nxml-slash-auto-complete-flag t)

您实际上不需要设置nxml-slash-auto-complete-flag,但它可以让您自动完成标记,这非常好。