使用方法
把乱缩进的配置理顺,四步:
- 把 YAML 粘进上面文本框,或直接改演示配置(演示配置故意把缩进写成 4、6、12 空格混用,方便看效果)。上限 200000 字符。
- 「缩进空格数」填 2,可填 1~8。项目里用 4 空格就填 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 空格下的处理结果:
| 语法 | 原始写法 | 格式化后 | 说明 |
|---|---|---|---|
| 顶层键值对 | name:liuquan-tools | name: liuquan-tools | 只认「冒号 + 空格或行尾」,补一个空格 |
| 冒号后多空格 | version: 2.4 | version: 2.4 | 多余空格压缩成一个 |
| 嵌套映射 | owner: 换行后 4 空格 name: ops | owner: 换行后 2 空格 name: ops | 子级缩进统一重排 |
| 顶层序列 | tags: 换行后 - seo | tags: 换行后 - seo | 序列项与父键同层,不加额外缩进 |
| 嵌套序列 | ratios: 换行后 6 空格 - 0.25 | ratios: 换行后 4 空格 - 0.25 | 子序列层级为 2,缩进 4 空格 |
| 深层映射 | options: 换行后 12 空格 charset | options: 换行后 4 空格 charset | 层级只看缩进变化,与原宽度无关 |
| 块标量 | notes: | 换行后两行说明 | notes: | 换行后两行说明 | 竖线块内容原样照抄不重排 |
| 注释行 | # 演示:站点配置 | # 演示:站点配置 | 跟随当前层级,可整体移除 |
| 空行 | 一个空行 | 保留一个空行 | 可切换为移除 |
| 引号内的冒号 | title: "a: b" | title: "a: b" | 引号内不做键值拆分 |
| 布尔与数字 | enabled: true / retry: 3 | enabled: true / retry: 3 | 原样输出,不做类型转换 |
| 行尾注释 | retry: 3 # 重试次数 | retry: 3 # 重试次数 | 保留;选移除时连同注释一起删掉 |
| 缩进宽度 4 | 同上任意层级 | 每层 4 空格 | 层级数量不变,只改每层宽度 |
| 缩进宽度 8 | 同上任意层级 | 每层 8 空格 | 适合需要宽缩进的团队规范 |
| 折叠块标量 | desc: > 换行后多行文本 | desc: > 换行后多行文本 | 大于号块同样原样保留 |
| 带引号的键 | "a b": 1 | "a b": 1 | 引号保护键名中的空格 |
对照表里「嵌套序列」与「深层映射」两行最能说明本页的做法:原始缩进是 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 面板复查,点「格式化」时没有任何请求发出。