🧰 UtlKit

YAML 格式化怎么用: 注释消失, 别名展开成完整副本, 3.0 变成 3, 格式化与压缩两种模式、2 或 4 空格缩进与行列号报错一次讲清

逐步走通 YAML 格式化器的确切行为: 注释被丢弃, 别名展开成完整副本, 键序保持(整数样键除外), 数字被规范化, 压缩模式的 flow 风格, 以及带行号和列号的错误信息.

YAML 是 Docker Compose, Kubernetes, CI/CD 流水线和 Ansible 的默认配置格式, YAML 格式化器解决的就是让这些文件重新变得可读. 粘贴任意 YAML 文档, 选择两种模式之一, 工具会在浏览器里整体重新输出文档, 缩进完全一致. 不存储, 不上传, 解析器和序列化器都跑在本机.

粘贴 YAML 并选择模式

这里没有实时重排: 只有按下按钮时才会处理文档. 格式化是默认模式, 以块状风格重建文档, 也就是大多数配置文件使用的一键一行布局. 压缩面向另一个目标, 生成解析器仍能读取的最紧凑表示. 一个小的缩进选择器让格式化在 2 空格和 4 空格之间切换, 它只在格式化模式出现, 因为压缩永远使用 2 空格.

格式化做了什么: 一份干净的块状文档

格式化把文档的每一层都归一到你选择的缩进. 嵌套的映射和序列对齐到固定偏移, 尾部空格消失, 一层永远等于一步缩进. 长值从不换行: 400 个字符的值仍然留在单行上, 因为在配置文件里, 结构的可读性比行长更重要.

压缩做了什么: 块状顶层之下的 flow 风格

压缩不会把文档压成一行, 这一点常让人意外. 顶层保持块状风格, 但每个顶层键之下的值都以 flow 形式写出: 字符串列表变成 items: [a, b], 嵌套映射变成 a: {b: [1, 2]}. 顶层的映射列表每行变成一个 flow 映射, 以短横线和左花括号开头. 在 flow 里可能被误读的值, 比如叫 y 的键, 会被加上引号以保持语义精确.

格式化丢弃和改写了什么

三件事值得在对比输出之前知道. 注释会被丢弃: 解析器先把文档变成数据结构, 注释在那一步就没了. 锚点和别名在解析时被理解, 但序列化器被配置为不输出引用, 所以每个别名都变回它所指向值的完整副本. 数字也会被规范化: 3.0 变成 3, 1e5 变成 100000, 0x10 变成 16, 空值, 波浪号和 null 都输出为 null, 而空字符串保持为空字符串并带引号.

键的顺序: 保持, 有一个例外

格式化不会给键排序. 字符串键完全保持文档中的顺序, 所以按 zebra, ant, m 排列的文件原样回来. 有一个看起来像排序的例外: 长得像整数的键, 比如 123, 会移到映射的最前面. 这不是格式化器选择了顺序, 而是持有解析结果的 JavaScript 对象列举属性的方式, 整数样键永远排在最前.

带行号和列号的错误信息

非法 YAML 不会得到含糊的失败. 解析器会报告问题所在, 附行号和列号, 都从 1 开始, 你可以直接跳到出错的位置. 重复键也以同样的方式被拒绝, 当复制的块不小心出现两次时这很有用. 有一个情况不同: 输入中出现第二个文档标记同样是错误, 但那条信息没有位置, 因为解析器在流级别就停了. 什么都不粘贴会显示一条专门的信息.

交换, 清除, 以及下一步

两个小控件收尾整个流程. 交换按钮在出现输出后显示, 把输出复制回输入并清空输出, 这让迭代修复很快: 格式化, 发现要重做的值, 交换, 编辑, 再格式化. 清除把两边和错误行都清空. 页面上什么都不存储, 敏感配置内容永远不会离开浏览器. 如果数据以 JSON 开始, 先用 JSON 格式化, 或直接走 JSON/YAML 转换器. XML 配置在 XML 格式化 里得到同样处理, 标记文件则参考 HTML 格式化教程, 它讲同样的格式化与压缩模式并带受保护脚本块.

相关工具

常见问题

格式化时 YAML 注释会被保留吗?

不会. 格式化器先把文档解析成数据结构, 注释不属于这个结构, 所以格式化和压缩两种输出里都没有注释. 如果注释必须保留, 把它留在编辑器或版本控制里, 而不是格式化后的副本里.

为什么我的锚点和别名消失了?

解析器理解锚点和别名, 但序列化器被配置为不输出引用: 每个别名都变回它所指向值的完整副本, 结果里不会出现锚点名. 重复的内容是得到一个自包含文档的代价.

压缩会把整个文档压成一行吗?

不会. 顶层保持块状风格, 每个顶层键之下的值都写成紧凑的 flow 形式, 比如 items: [a, b] 或 a: {b: [1, 2]}. 顶层的映射列表每行一个 flow 映射. 两种模式里长行都不换行.

为什么我的一个键移到了最前面?

字符串键保持原始顺序, 没有任何按字母排序. 例外是长得像整数的键, 比如 123: 解析后的文档保存在一个 JavaScript 对象里, 整数样键永远排在其他键之前, 所以这个键跳到最前面.

错误信息长什么样?

语法问题产生带行号和列号的 Error 信息, 两者都从 1 开始, 你可以直接跳到出错位置. 重复键也以同样方式被拒绝. 输入中的第二个文档标记同样是错误, 但那条信息没有位置, 因为解析器在流级别就停了, 什么都不粘贴会显示专门的空输入信息.

相关文章