Clash 配置是 YAML 文本。阅读其中的列表,先抓住规范里的三种基本结构:序列、映射和标量。序列是有序的一组条目,也就是常说的列表。块序列的每一项单独占一行,并用短横线加空格引出;缩进决定这项属于哪一层集合。flow 序列写在方括号里,用逗号分隔。读列表时看节点种类和从属关系,而不是某一行是否好看。
适用条件
适用于打开 Clash 所用 YAML、需要辨认哪一段是列表、每一项从哪里开始到哪里结束的场合。适用于列表项本身又是映射,或列表作为某个键的值出现的场合。不适用于订阅未能下载。本文依据 YAML 1.2.2 的集合、缩进与节点种类规则。
按指示符与缩进阅读块列表
- 找短横线加空格。规范写明块序列用「- 」标明每一项,块集合用缩进确定范围,并且每一项从新行开始。没有这条短横线的行,不要先当成列表项。
- 看缩进属于谁。示例把若干队名写在 american 或 national 这类键下面,短横线比键更深,表示映射的值是一个序列。若短横线与某个键对齐,该项属于外层序列,而不是该键的值。
- 列表项可以是映射。示例在短横线后连续写多个键;规范还说明,在块集合里,键值对可以紧跟在短横线、冒号或问号后面开始。随后比短横线更深、且不再写新短横线的键,仍属于同一列表项,直到缩进回到该短横线所在级别。
- 注释以井号开始,解析后丢弃,不能当成列表项。三条短横线是文档开始标记,不要把它数进序列长度。
判断依据:加载后该节点种类为序列,并且同一父节点、同一缩进下你数到的短横线条数与序列长度一致。
阅读 flow 列表与嵌套
方括号里的逗号分隔写法是 flow 序列,范围由括号决定而不是缩进。序列的条目还可以是另一个序列。阅读时先确定外层是序列还是映射,再看每一项是标量、映射还是内层序列。块与 flow 只是呈现样式,表示里种类相同则都是序列。多行 flow 标量的换行会被折叠,那是标量写法,不要误认为又开了一层列表。
失败时下一步
若无法判断某行属于哪一层,先标出该行缩进和行首指示符,对照「短横线加空格表示序列项、冒号加空格表示映射键值、井号表示注释」。加载失败属于格式不良,应先修流再阅读结构。能加载但项数与短横线不一致,检查是否把映射键误认成列表项,或把紧凑写在短横线后的多个键拆成了多项。不要根据空行或注释来数列表长度。