修改 Clash 配置时,同名字段是否重复,要按 YAML 映射节点来看,而不是按「文件里某个词出现过几次」来看。规范把映射定义为键唯一的无序关联:同一个映射里,每个键只能对应一个值。避免重复定义,就是避免在同一映射内写入相等的键。不同映射可以出现相同的键名,例如序列里两条记录各自都有 name,那并不构成重复键。
适用条件
适用于在一份 YAML 流中增删改字段、从别处粘贴片段、或把块映射与花括号 flow 映射写在同一层之后的整理。适用于能分辨哪一段属于同一个映射的场合。不适用于订阅或网络失败。注释里的文字也不算已定义字段:解析会丢弃注释,构造不得依赖注释。
操作步骤与判断依据
- 先圈定当前映射的范围。块映射靠缩进确定范围,flow 映射靠花括号。只有落在同一映射内的键才会互相冲突。序列是有序条目,条目之间的同名键分属不同映射。
- 在该范围内列出所有键。键可能是普通标量,也可能是问号引出的复杂键。比较的是加载后的节点,不是源码字形:引号和样式属于呈现,解析会丢掉这些细节。两个写法不同、表示相同的键,仍算同一键。
- 若该映射已有此键,不要再写一遍指望后面覆盖前面。映射键必须唯一;键顺序只在序列化时被强加,构造不得使用键顺序。需要改值时,只保留一个键并修改它的值。
- 若目的是让同一份数据出现在两处,应使用锚点与别名:先用 & 标识节点,再用 * 引用。规范示例让同一节点出现两次,靠的是别名,不是写两个相同的键。
- 通过标准:每个映射内键唯一;重复出现的是节点引用而不是重复键;空白和注释不参与计数。
失败时下一步
加载失败属于格式不良或组成表示图失败,应回到修改前的字符流,不要继续粘贴。若能加载但字段值与预期不符,先按上面步骤把同名键删到只剩一个再加载。需要顺序敏感的键值列表时,应改用规范示例中的有序映射写法(序列里每个映射只含一个键),而不是靠重复键模拟覆盖。确认前不要覆盖仍可加载的配置。