先分清定义处和引用处
重命名策略组之前,要找的是配置里所有把该组当作成员来引用的位置,而不是看见相同文字就改。代理组配置要求必须填写 name,它是策略组的名字;如有特殊符号,应当使用引号将其包裹。这一行是定义处,改名时必然要动。文档说明 proxies 用于引入出站代理或其他策略组,因此其他策略组若在 proxies 下列出旧名字,就是引用处,必须一并修改。
适用条件如下。第一,你使用的是带 proxy-groups 的配置,准备改的是某一策略组的 name,而不是某个出站节点自己的名称。第二,目标对象不是 use 里的代理集合名。第三,只有组与组之间可能嵌套时,才需要做引用排查;若没有任何组在 proxies 里写其他组名,引用集合可以为空,但必须先完成搜索才能得出这个结论。
判断依据是字段语义。include-all 引入所有出站代理以及代理集合,顺序将按照名称排序,但引入不包含策略组,可在 proxies 引入其他策略组。include-all-proxies 只引入所有出站代理,同样不包含策略组。include-all-providers 引入所有代理集合。打开这些开关并不会自动把策略组名登记为引用。只有写在 proxies 里的组名,才进入「重命名必须同步」的清单。
按字段建立引用清单
具体操作按字段做成清单,避免漏检。
第一步,从目标组抄出完整 name 字符串,记录是否使用引号、是否含空格。第二步,遍历其余每个策略组,阅读其 proxies 列表,凡与旧名完全一致的项都记为引用。第三步,阅读 default-selected。该项是默认选择的节点;为空或者设置的节点名不存在时,默认选择组中第一个节点。这里比对的是组内节点名。若有人把策略组名填进去,应按「节点名不存在」来理解,而不是按组引用理解。第四步,阅读 empty-fallback。当组为空时的回退 proxy 默认为 COMPATIBLE,这里不支持填写代理组,只支持填写 proxy 名称。旧组名若出现在这里,应从引用清单中剔除,并视为无效填写。
第五步,排除不会引用策略组的字段。type 只说明策略组类型。use 引入代理集合。filter 筛选满足关键词或正则表达式的节点,可以使用反引号区分多个正则表达式,且仅作用于引入代理集合以及引入所有出站代理。exclude-filter 排除满足关键词或正则的节点。exclude-type 不支持正则表达式,通过 | 分割,根据节点类型排除,仅排除引入出站代理。这些内容即使含有与组名相同的字,也不构成策略组引用。重命名时不必改筛选表达式,除非当初把组名误写进了筛选条件。
完成以上步骤后,引用清单应只包含:目标组的 name 定义,以及其他组 proxies 中的同名项。重命名时这两类必须一起改成新名,并继续遵守特殊符号用引号包裹的规则。
检索失败后的下一步
若搜索结果为零,不要立刻认为没有引用。下一步先对同一名字做变体检索:有引号与无引号、首尾空格、大小写不同的副本。特殊符号应当使用引号包裹,漏检引号会导致定义处或引用处被跳过。然后确认是否把出站代理名、代理集合名、策略组名搜混。proxies 里既可以是出站代理也可以是其他策略组,需要结合该名字是否曾作为某个策略组的 name 出现过来判断。
若已经改名,但某个上层组不再包含预期成员,回到该上层组的 proxies,查看是否仍写着旧组名。引用未改会造成成员缺失;这与 filter 无关,因为筛选不作用于被引入的策略组。若组变为空,再看 empty-fallback 是否按 proxy 名称回退。若新名字与已有节点重名,检查 default-selected 是否指向了错误对象,依据仍是节点名存在与否。最后确认每个组仍具备必须的 name 与 type,列表缩进完整,再保存配置。