【问题标题】:Emacs xml mode indent with tabs带有制表符的 Emacs xml 模式缩进
【发布时间】:2013-08-09 22:50:48
【问题描述】:

我拼命尝试让我的 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 文件中的制表符缩进?为什么我的钩子不起作用?

【问题讨论】:

  • c-tab-always-indent 用于 C/C++/Java。由于 xml 不继承它们,我认为它不会起作用
  • 你应该使用等效的 tab-always-indent var
  • @abo-abo: tab-always-indent 在点击 tab 时总是会插入一个 tab。但是,我希望 auto-indentation 使用制表符,这样如果缩进已经正确并且我点击了 TAB,则什么也不会发生。对于手动插入标签,我总是可以使用 C-q TAB。

标签: xml emacs indentation sgml


【解决方案1】:

(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) 应该做的(在你的 sn-p 中你使用的是psgml-mode-hook

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

编辑

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

(并且由于这些变量的默认 emacs 值是 2 和 8,恕我直言,使用 emacs 中的制表符配置 emacs 以缩进 XML 比应有的困难)

【讨论】:

  • 你说得对,我用的是nxml-mode。不过,您的解决方案似乎不起作用。即使我在 xml 缓冲区中运行 eval-expression: (setq indent-tabs-mode t) 仍然使用 2 个空格进行缩进。
  • sgml 和 nxml 缩进的问题是它们使用缩进。当标签不适合时,此功能将使用空格。因此,您应该检查 sgml-basic-offsettab-width 的配置方式是否匹配(例如都为 4),并且前面的行是否以该数量的倍数缩进。
  • 我将两个变量都设置为 4,并从最左边开始的一行下方开始缩进,仍然缩进 2 个空格 :(
  • 尝试同时增加nxml-child-indent
  • 谢谢 - 这个变量有效!我需要使它与 *.xml (emacs 24) 中的选项卡对齐是 .emacs 中的以下代码:(defun my-indent-func () (setq nxml-child-indent 4) ) (add-hook 'nxml-mode-hook 'my-indent-func) 。问题解决了 - 感谢 jualeon
【解决方案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,但它可以让您自动完成结束标签,这真的很棒。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多