如何在Vim中快速格式化XML代码

在 Vim 中快速格式化 XML 需先安装 xmllint,再于 .vimrc 中配置 formatprg 或快捷键(如 f),支持全文件/选区格式化,并可处理编码与缩进问题。

在 Vim 中快速格式化 XML 代码,核心是借助外部工具(如 xmllint)并配置好快捷键或命令,无需手动缩进或换行。

确保系统已安装 xmllint

xmllint 是 libxml2 提供的命令行 XML 工具,多数 Linux 发行版自带,macOS 可通过 Homebrew 安装:

  • Linux(Debian/Ubuntu):sudo apt install libxml2-utils
  • macOS:brew install libxml2(通常已包含 xmllint
  • Windows(WSL 或 Git Bash):安装对应发行版的 libxml2-utils

终端中运行 xmllint --version 确认可用。若不可用,Vim 的格式化命令会失败。

在 Vim 中配置 XML 格式化命令

将以下内容添加到你的 ~/.vimrc(或 ~/.config/nvim/init.vim)中:

autocmd FileType xml setlocal formatprg=xmllint\ --format\ --recover\ -

这行配置让 Vim 在 XML 文件中启用 gq 命令时调用 xmllint 自动美化。之后只需:

  • 选中要格式化的文本(如 ggVG 全选),再按 gq
  • 或直接对当前行/可视块使用 gq

注意:--recover 参数可容忍轻微语法错误(如缺失闭合标签),避免格式化中断。

更便捷的一键格式化映射(推荐)

.vimrc 中添加快捷键,比如用 f 触发全文件格式化:

autocmd FileType xml nnoremap  f :%!xmllint --format --recover - 

这样打开 XML 文件后,按下 \f(默认 \)即可整份重排。你也可以把 改成 ,其他键位。

处理编码与空格问题

如果 XML 声明含 encoding="GBK" 或类似非 UTF-8 编码,xmllint 可能报错。此时建议:

  • 先在 Vim 中转为 UTF-8::set fileencoding=utf-8 | write!
  • 或强制指定输入编码::%!xmllint --encode utf-8 --format --recover -
  • 若输出缩进用 tab 不满意,可加 --nsclean 并配合 --indent(新版 xmllint 默认启用)

默认缩进为 2 空格;如需 4 空格,目前 xmllint 不支持直接配置,可后续用 :%s/^ / /g 批量替换,或改用 xmlstar 等替代工具。