这几天,我碰到一个烦人的事情:
我在 Markdown 文件中插入了一些代码示例。这些代码示例是用 DITA 编写的样板主题,也就是 XML 源代码。
可是,源代码的缩进不统一,有的使用一个空格缩进,有的使用四个空格缩进。当我将它们复制到Markdown 文件中时,代码示例的显示效果杂乱不堪。
为了统一代码示例的显示效果,我尝试了多种批量编辑 XML 文件缩进的方法。本文将记录这些方法并总结它们的应用场景,以备日后不时之需。
多行编辑
代码编辑器通常都有列选功能,即选中并编辑一个任意宽度、任意高度的矩形区域中的多行文本。
以 VS Code 为例,将光标移动到起始位置,按住 Alt+Shift 键的同时拖动鼠标或者在结束位置单击,就可以选中以起始位置为左上角、以结束位置为右下角的矩形区域中的多行文本,并对这么多行文本同时进行编辑。
如果代码的层级少并且子元素都集中在一两个父元素中,列选无疑是最直观、最简洁、最灵活的编辑方法。不过,它的缺点也很明显,就是每次只能修改一个层级的缩进。
更改制表符显示大小
如果代码层级很多或者子元素很分散,使用列选修改缩进就会变得很繁琐。我在户外散步的时候突然灵光乍现,想到了另一种可能的解决方法:将缩进用的空格转换成制表符,然后再更改制表符的显示大小。回去一试,果然好用!
以 VS Code 为例,如果要将 XML 文件中每一层级的缩进由四个空格改为两个空格,总共需要三步或四步:
第一步,点击 VS Code 窗口底部状态栏中的【选择缩进】或者从顶部菜单栏选择【查看】>【命令面板】(快捷键为 Ctrl+Shift+P), 在命令面板中选择【更改制表符显示大小】,然后将其设置为当前 XML 文件中每一层级缩进的空格数。 在本例中,【更改制表符显示大小】应该设置为 4。
第二步,再次点击 VS Code 窗口底部状态栏中的【选择缩进】,在命令面板中选择【将缩进转换为制表符】。
第三步,再次点击 VS Code 窗口底部状态栏中的【选择缩进】,在命令面板中选择【更改制表符显示大小】,然后将其设置为你希望在每一层级缩进的空格数。 在本例中,【更改制表符显示大小】应该设置为 2。
第四步是可选步骤。如果你希望使用空格缩进,就再次点击 VS Code 窗口底部状态栏中的【选择缩进】,在命令面板中选择【将缩进转换为空格】。如果你希望使用制表符缩进,跳过该步骤即可。
这个方法可以一次性修改整个 XML 文件中的缩进,但每次也只能修改一个 XML 文件中的缩进。
格式化文档
首先,安装一个可以格式化 XML 文件的 VS Code 插件,比如 XML 或 XML Tools。然后,就可以修改 XML 文件的缩进了。
如果要将 XML 文件中每一层级的缩进由四个空格改为两个空格,总共需要两步:
第一步,点击 VS Code 窗口底部状态栏中的【选择缩进】,在命令面板中选择【使用空格缩进】或者【使用制表符缩进】,然后在弹出的列表中“选择当前文件的制表符大小”。在本例中,选择【使用空格缩进】,制表符大小设置为 2。
第二步,在 XML 文件的任意位置使用右键单击,并从右键菜单中选择【格化化文档】。
如果你安装了多个可以格式化 XML 的插件,可以在【使用…格式化文档】中选择一个你想用的插件或配置一个默认的格式化插件。
和更改制表符显示大小一样,格式化文档可以一次性修改整个 XML 文件中的缩进,但每次也只能修改一个 XML 文件中的缩进。
正则表达式
如果有多个 XML 文件都需要调整缩进,在一个又一个文件中更改制表符的显示大小或者格式化文档就会变成枯燥的重复性劳动。这个时候,正则表达式就派上用场了。
以 VS Code 为例,如果要将多个 XML 文件中每一层级的缩进由一个空格改为两个空格,总共需要五步:
第一步,将需要调整缩进的 XML 文件集中存放在同一个文件夹中。
第二步,点击 VS Code 窗口侧边栏的搜索图标或者从顶部菜单栏选择【编辑】>【在文件中替换】(快捷键为 Ctrl+Shift+H),打开搜索编辑器。
第三步,点亮搜索文本框最右侧的正则表达式图标,并在文本框中输入正则表达式。在本例中,在搜索文本框中输入正则表达式:
^(\x20+)
上式可以匹配每行开头的一串空格。其中,
\x20表示空格,可以替换为普通空格。
在替换文本框中输入替换文本。在本例中,在替换文本框中输入以下文本:
$1$1
上式可以将每行开头的空格数量翻倍。其中,
$1表示正则表达式中的圆括号匹配到的内容。
第四步,在【包含的文件】文本框中输入包含 XML 文件的文件夹路径,比如:
project/dita-samples/xml-indent-fix
如果该文件夹中包含不需要进行处理的文件,请将其填写到【排除的文件】文本框中。
如果搜索编辑器中没有显示【包含的文件】和【排除的文件】,点击查找文本框右下方的【切换搜索详细信息】按钮(也就是显示为三个点的图标)。
第五步,点击替换文本框正右方的【全部替换】按钮。
使用正则表达式可以一次性修改多个 XML 文件中的缩进。但是,你需要根据实际需求自行调整正则表达式的写法,而且在有些场景中可能写不出完美的正则表达式。
例如,如果你要将多个 XML 文件中每一层级的缩进减半(比如将四个空格改为两个空格),就没有一个通用的正则表达式和替换文本可以一次性完成所有修改。我能想到的最好的方法是,要么一个层级一个层级的修改,要么根据 XML 文件中的最大缩进层级来定制正则表达式和替换文本。
格式化和缩进
要一次性修改多个 XML 文件中的缩进,最便捷的方法是使用 Oxygen XML 系列编辑器。
如果要将多个 XML 文件中每一层级的缩进由四个空格改为两个空格,总共需要两步:
第一步,从主菜单中选择【选项】>【首选项】,并在弹出的首选项对话框中选择【编辑器】>【格式】选项卡。
如果你希望将所有 XML 文件中的缩进全部修改为制表符,勾选缩进分组中的【使用制表符缩进】复选框。
如果你希望将所有 XML 文件中的缩进全部修改为空格,确保缩进分组中的【文件打开时识别缩进】和【使用制表符缩进】复选框都没有被勾选,然后将下方的【缩进距离】设置为你需要的空格数。
缩进分组中的【文件打开时识别缩进】和【使用制表符缩进】复选框是互斥的,即两者中只能有一个能被勾选。
在本例中,取消勾选缩进分组中的【文件打开时识别缩进】复选框或【使用制表符缩进】复选框,并将下方的【缩进距离】设置为 2。如果你的软件界面与下图不符,请安装 OxyCNUI插件。
第二步,从主菜单中选择【工具】>【格式化和缩进文件】,并在弹出的格式化和缩进文件对话框中勾选需要修改缩进的文件范围以及其他选项。
在本例中,在范围分组中勾选【指定路径】,并查找或填写需要修改缩进的 XML 文件所在的文件夹。如果你的软件界面与下图不符,请安装 OxyCNUI插件。
Duang,就这么简单!要不说呢,还得是 Oxygen XML!
相关问题
默认情况下,静态文档网站生成器 MkDocs 会将代码块中的制表符转换为四个空格。如果你希望保留制表符,可以在配置文件 (mkdocs.yml) 中修改一下 Markdown 扩展 SuperFences 的设置:
markdown_extensions:
- pymdownx.superfences:
preserve_tabs: true
MkDocs 默认将代码块中的制表符显示为四个空格的距离。你可以使用 CSS 文件自定义制表符的大小,比如使用以下代码将制表符大小设置为两个空格:
code {tab-size: 2;}
参考资料
- Oxygen XML Docs: Format Preferences. [-][2026-04-21].
- Oxygen XML Docs: Format and Indent (Pretty-Print) Multiple Files. [-][2026-04-21].
- Abhishek Kumar. Handling Indentation in VS Code. [2025-05-14][2026-04-17].
- Deborah Barnard. Prevent MkDocs from replacing tabs with spaces in code blocks. [2025-05-14][2026-04-17].