YAML格式化

把缩进乱掉的 YAML 粘进来,本页按层级重排缩进、统一冒号后的空格,并给出行数、键数量与最大层级。注释、空行和块标量都能按需保留,全部在浏览器本地处理,配置不上传服务器。

处理口径:本页是基于行的缩进重排,不是完整的 YAML 解析器 —— 只按缩进变化推断层级,把冒号后的多余空格并成一个,块标量(|、>)及其内容按原文照抄。锚点、别名、多行折叠等高级语法不在处理范围,请勿依赖本页做语义校验。文本区按 Ctrl(Mac 为 Command)加回车即可重新格式化,回车留给换行。

使用方法

把乱缩进的配置理顺,四步:

  1. 把 YAML 粘进上面文本框,或直接改演示配置(演示配置故意把缩进写成 4、6、12 空格混用,方便看效果)。上限 200000 字符。
  2. 「缩进空格数」填 2,可填 1~8。项目里用 4 空格就填 4,本页按这个值重排每一层。
  3. 「注释」和「空行」选保留或移除。要提交给生产环境、不想带上调试注释时选移除;只是整理本地文件时保留更好读。
  4. 点「格式化」,或在文本框按 Ctrl + 回车(Mac 是 Command + 回车)。下方结果区同步更新,四张卡片给出行数、键数量、最大层级和缩进宽度;对照表可导出 CSV 或复制 TSV。

YAML格式化能解决什么

它解决「手改配置后缩进全乱、看不出谁是谁的子级」的问题,适合三类场景:

  • 救回手改坏的配置:演示配置里 database 下的键原本缩进 6 空格、options 下又缩进 12 空格,重排后统一成 2 和 4 空格,层级一眼看清,共 26 行、18 个键。
  • 团队协作统一风格:冒号后面有的空格有的三个空格(version: 2.4),重排后全部并成一个空格,diff 里不会再出现纯空格噪音。
  • 提交前清理调试痕迹:把「注释」和「空行」都设为移除,一次清掉临时注释和反复编辑留下的空行;需要留痕时再切回保留。

本页不做的事:不校验 YAML 是否合法,也不报语法错误;不解析锚点(&)、别名(*)、标签(!!)和多文档分隔(---),这些片段按普通行处理;不做键排序、不去重、不把 JSON 转成 YAML;不保证输出与原文件语义完全等价,重要配置请先备份再替换。

原理和变量

① 用了哪个具体函数:核心是一个缩进栈 —— 每行先算前导空格数 ind,与栈顶比较:大于栈顶就 push、小于就 pop,层级取 stack.length - 1;输出缩进用 ' '.repeat(lvl * size) 生成,键与值之间只补一个空格。

② 关键参数为什么这样取:用「缩进栈」而不是「缩进除以宽度」,是因为手工编辑的 YAML 缩进常常不是整数倍(演示里就有 6 和 12 混用),除法会得出错误层级;比较法只看相对变化,与原始宽度无关。冒号定位必须跳过引号,否则 title: "a: b" 会被拆成两段。

③ 遵循哪个标准:缩进重排遵循 YAML 1.2 的缩进语义 —— 同层同级、子级必须更深;块标量(| 保留换行、> 折叠换行)按规范属于「内容块」,本页因此原样保留其内部换行与相对缩进,不参与重排。

④ 输入怎么变成输出:演示配置里 version: 2.4 定位到冒号后,键 version、值 2.4,输出 version: 2.4; host 的原缩进 6 大于栈顶 0,入栈后层级为 1,输出 2 空格缩进; charset 缩进 12 大于栈顶 6,层级为 2,输出 4 空格。notes: | 之后两行缩进更深,进入块模式整段照抄。

⑤ 边界与阈值:缩进宽度限 1~8,超出提示并回退到 2;文本上限 200000 字符;输入为空或只有空白时提示「文本框是空的」而不是静默清空结果;块标量一旦触发,会一直照抄到出现缩进不再更深的非空行为止。

⑥ 常见误用的正确解释:本页不会把非法 YAML 修成合法的,缩进错了它只会按错误的层级重排,结果仍然非法 —— 格式化不等于校验,提交前请用真正的解析器验证;把 JSON 粘进来也不会转成 YAML,因为 JSON 的层级靠括号而非缩进;缩进宽度改成 8 不会让层级变多,只让每层更宽。

完整示例(数值仅作演示)

用演示配置、缩进 2 空格、保留注释与空行,格式化前后的对应关系:

  • version: 2.4 → version: 2.4(冒号后三个空格并成一个)。
  • owner: 下的 name: ops → name: ops(原 4 空格,层级 1,重排为 2 空格)。
  • ratios: 下的 - 0.25 → - 0.25(子序列层级 2,重排为 4 空格)。
  • database: 下的 host: 127.0.0.1 → host: 127.0.0.1(原 6 空格只是比上层深,层级仍为 1)。
  • options: 下的 charset: utf8mb4 → charset: utf8mb4(层级 2,重排为 4 空格)。
  • 统计结果:输出 26 行、键数量 18 个、最大层级 3 层、缩进 2 空格;notes: | 两行块内容原样保留,不参与重排。

把「缩进空格数」改成 4 再点一次格式化,行数、键数量、最大层级都不变,只有每层宽度从 2 变成 4 —— 这正是「格式化不改语义、只改排版」的直观验证。

输入范围与对照表

输入范围:任意 YAML 文本,上限 200000 字符;缩进宽度 1~8;注释与空行各两档(保留 / 移除)。下表列出常见写法在缩进 2 空格下的处理结果:

常见 YAML 写法与格式化结果对照(缩进宽度 2,注释与空行均保留)
语法原始写法格式化后说明
顶层键值对name:liuquan-toolsname: liuquan-tools只认「冒号 + 空格或行尾」,补一个空格
冒号后多空格version: 2.4version: 2.4多余空格压缩成一个
嵌套映射owner: 换行后 4 空格 name: opsowner: 换行后 2 空格 name: ops子级缩进统一重排
顶层序列tags: 换行后 - seotags: 换行后 - seo序列项与父键同层,不加额外缩进
嵌套序列ratios: 换行后 6 空格 - 0.25ratios: 换行后 4 空格 - 0.25子序列层级为 2,缩进 4 空格
深层映射options: 换行后 12 空格 charsetoptions: 换行后 4 空格 charset层级只看缩进变化,与原宽度无关
块标量notes: | 换行后两行说明notes: | 换行后两行说明竖线块内容原样照抄不重排
注释行# 演示:站点配置# 演示:站点配置跟随当前层级,可整体移除
空行一个空行保留一个空行可切换为移除
引号内的冒号title: "a: b"title: "a: b"引号内不做键值拆分
布尔与数字enabled: true / retry: 3enabled: true / retry: 3原样输出,不做类型转换
行尾注释retry: 3 # 重试次数retry: 3 # 重试次数保留;选移除时连同注释一起删掉

对照表里「嵌套序列」与「深层映射」两行最能说明本页的做法:原始缩进是 6 还是 12 不重要,只要比上一层更深,层级就只加一。

结果边界和舍入

输出性质:结果是纯文本,行数、键数量、最大层级都是整数,不做四舍五入;缩进宽度按 ' '.repeat 生成,不存在半空格。

什么时候会提示:缩进宽度不在 1~8 会提示并回退到 2;文本超过 200000 字符会提示先拆分;输入为空或只有空白字符时提示「文本框是空的」。注释与空行是下拉选择,不存在非法值。

统计口径:行数按输出换行符切分后计数,含注释行、空行与块标量内容行;键数量只统计「含顶层冒号」的映射行,序列项(- seo)与块内容不计入;最大层级从 0 起算,顶层为第 1 层。

结果性质:本页是排版工具不是解析器,输出不保证语义等价。锚点、别名、标签、多文档分隔与折叠块的高级行为都不在处理范围内,重要配置文件请先备份,再用正式解析器验证后替换。

常见问题

能检查我的 YAML 是否合法吗?

不能。本页只按缩进变化重排排版,不判断语法。缩进写错时它会把错误的层级照着重排一遍,结果仍然非法 —— 提交前请用真正的 YAML 解析器验证。

块标量(竖线、大于号)里的内容会被改吗?

不会。一旦识别到值是 | 或 >,其后的更深层行会整段原样照抄,包括内部换行和相对缩进,直到出现缩进不再更深的非空行。

序列项为什么没有额外缩进?

这是 YAML 的常见风格:序列项与父键同层,- 本身就起到缩进作用。演示配置里 tags: 下的 - seo 保持在第 0 层,ratios: 下的 - 0.25 则在第 2 层(缩进 4 空格)。

把缩进改成 4 会影响层级吗?

不会。缩进宽度只决定每层多少个空格,层级数量由缩进的相对变化决定。改成 4 后行数、键数量、最大层级都不变,只是每层更宽。

锚点、别名和多文档会怎样?

本页不解析这些语法,相关行按普通行处理:缩进照常重排,内容原样保留。请勿依赖本页处理含锚点或 --- 分隔的复杂文件,用前先备份。

能去掉注释但保留空行吗?

能。「注释」选移除、「空行」选保留即可,两个开关互相独立。移除注释时会连同行尾注释一起删掉,只保留键值部分。

能导出格式化结果吗?

能。点「复制结果」把格式化后的文本整段拿走,或直接框选结果文本框复制;下方「导出 CSV」与「复制对照表」则用于导出语法对照表。

我的配置会被上传吗?

不会。格式化在浏览器内完成,刷新即清空;可在 Network 面板复查,点「格式化」时没有任何请求发出。

相关工具