Emacs 通过 xml-mode 和 nxml-mode 提供良好 XML 编辑支持,含语法高亮、缩进、格式化、校验与补全;推荐启用 nxml-mode,集成 xmllint 实现验证,并用 sgml-pretty-print 或 xmllint –format 美化代码。

Emacs 对 XML 编辑支持良好,配合内置和少量扩展即可实现语法高亮、缩进、格式化、校验与补全。关键在于合理配置 major mode 和验证 工具 链。
启用 xml-mode 并优化基础编辑体验
Emacs 自带 xml-mode,打开 .xml 文件会自动激活。它提供基本的标签匹配、缩进和括号高亮。可添加以下设置提升可用性:
- 启用
electric-indent-mode(默认开启),让回车和自动缩进 - 开启
show-paren-mode,快速定位匹配的开始 / 结束标签 - 添加
(setq xml-sexp-element-name-face 'font-lock-function-name-face)让标签名更醒目 - 用
C-c C-o(xml-toggle-xml-declaration)快速插入或删除 XML 声明
使用 nxml-mode 替代默认 xml-mode(推荐)
nxml-mode 是更现代、功能更强的 XML 模式(包含在 GNU Emacs 22+ 中),支持 RELAX NG 验证、结构导航和实时错误提示:
- 在
.emacs或init.el中加入:(add-to-list 'auto-insert-alist'(xml . "XML skeleton"))(add-to-list 'auto-insert-alist'(nxml . "XML skeleton")) - 将
.xml关联到nxml-mode:(add-to-list 'auto-insert-alist'(xml . "XML skeleton"))(add-to-list 'auto-insert-alist'(nxml . "XML skeleton"))
更稳妥的方式是:(add-to-list 'auto-insert-alist'(xml . "XML skeleton"))(add-to-list 'auto-insert-alist'(nxml . "XML skeleton")) - 启用后,用
C-c C-s查看当前光标所在元素的完整路径,C-c C-r重命名标签,C-c C-e关闭当前标签
集成外部验证器(如 xmllint)进行语法与 DTD/XSD 校验
Emacs 本身不内建 XML Schema 验证,但可通过 flycheck 或 compile 调用 xmllint 实现即时校验:
- 确保系统已安装
xmllint(libxml2-utils 包,Linux;macOS 可用brew install libxml2) - 安装
flycheck:用package-install安装,然后在配置中启用:(add-hook 'nxml-mode-hook'flycheck-mode) - 配置
flycheck使用xmllint:
(flycheck-add-verifier 'xml-xmllint<br> :command ("xmllint" "--noout" "--schema" source "source")<br> :error-patterns ((error line-start (file-name) ":" line ":" column ": " (message) line-end)))然后设置:
(flycheck-select-checker 'xml-xmllint) - 若无 DTD/XSD,仅检查 well-formedness,可用:
xmllint --noout your-file.xml—— 错误会直接显示在*Compile*缓冲区
格式化与美化 XML(indent & pretty-print)
XML 手动排版易出错,推荐自动化处理:
- 在
nxml-mode中,选中区域后执行C-c C-r(nxml-refine-region)可按模式规则重新缩进 - 全局格式化:用
sgml-pretty-print(适用于xml-mode和nxml-mode),对整个缓冲区重排版 - 更可靠的方式是调用外部命令:
M-! xmllint --format -,然后粘贴内容或标记区域后执行,输出即为美化结果 - 可绑定快捷键:
(define-key nxml-mode-map (kbd "C-c f") 'nxml-formatter)
其中nxml-formatter是自定义函数,封装xmllint --format调用
不复杂但容易忽略:验证前确认文件 编码 为 UTF-8,且声明一致(如 <?xml version="1.0" encoding="UTF-8"?>),否则 xmllint 可能报编码错误。






























