RegReplace 的 chain 配置需设 "chain": true 并在 "rules" 数组中定义多个含 find/replace 的完整规则;默认非顺序执行,需加 "sequential": true 才实现真正链式替换,否则各步均作用于原始文本。

RegReplace 的 chain 配置到底怎么写
链式替换不是靠多次手动触发,而是靠 chain 字段在单次操作中依次执行多个正则替换。它本质是把一组 find/replace 按顺序串起来,前一个的输出作为后一个的输入——但要注意:**所有步骤都在原始文本上独立应用,不是流式管道**(这点常被误解)。
正确写法是在 .sublime-settings 或 RegReplace.sublime-settings 中定义一个 rule,其中 "chain": true 并列出 "rules" 数组:
{
"my_chain_rule": {
"chain": true,
"rules": [
{"find": "class="(\w+)"", "replace": "className="$1""},
{"find": "className="([^"]+)"", "replace": "class="$1""}
]
}
}
注意:rules 里每个对象必须是完整 rule 结构(含 find/replace),不能只写字符串;chain 必须为布尔值 true,设成 "true" 字符串会静默失效。
为什么 chain 后结果没变或只生效第一步
常见原因是规则之间存在干扰:比如第二步匹配的内容在第一步执行后才生成,但 RegReplace 的 chain 默认不基于上一步的修改结果重扫描全文——它只是按顺序对原始文本分别执行各步,等价于并行应用(除非显式启用 sequential)。
-
chain默认行为 = 多个独立替换同时作用于原始文本 - 要真正“链式”(即后一步处理前一步输出),必须加
"sequential": true - 加了
sequential后,性能下降明显,尤其大文件慎用 - 若某步
replace产生新匹配项,而后续步骤依赖该新增内容,就必须用sequential
例如想把 data-foo="bar" → foo="bar" → foo={bar},不加 sequential 第二步根本看不到第一步改出来的 foo="bar"。
如何调试 chain 规则是否生效
最直接的方式是打开 Sublime Text 控制台(Ctrl+`),执行命令观察日志:
view.run_command("reg_replace", {"replacements": ["my_chain_rule"]})
如果没反应,先检查:
- rule 名是否拼写一致(区分大小写)
- 是否已保存
RegReplace.sublime-settings并重启 Sublime(热加载不可靠) - 当前视图语法是否匹配 rule 中可选的
scope条件(如指定了"scope": "source.js",但在 plain text 文件里调用就无效) - 正则是否用了未转义的斜杠或引号导致 JSON 解析失败(建议用在线 JSON 校验器过一遍配置)
临时测试时,可把 find 改成极简模式,比如 "find": "a",确认基础替换能走通再逐步加复杂度。
chain 和 multi-step 的实际取舍
多数场景下,用多个独立 rule + 手动连续触发(快捷键反复按)比硬套 chain 更可控。真正需要 chain 的情况其实很窄:
- 必须保证多步原子性(不允许中间状态残留)
- 用户操作入口只有一个(比如绑定到某个菜单项,不能让用户自己点好几次)
- 规则间有严格顺序依赖且无法合并成单个正则(比如跨行处理 + 局部替换组合)
另外注意:chain 不支持 rule 内嵌 conditions 或 on_highlight 这类高级字段,这些只在顶层 rule 生效。一旦写了 chain: true,整个 rule 就退化为纯顺序替换容器。










