Ctrl+H的Replace All只改当前文件,因它默认为单文件、无正则、不跨目录;真正批量替换须用Ctrl+Shift+F(或Cmd+Shift+F)调出Find in Files面板,填Where为“.”或具体路径,启用.*正则模式,确认匹配后Replace All,并务必Save All。

为什么 Ctrl+H 的 Replace All 总是只改当前文件
因为 Ctrl+H 打开的是「单文件查找替换面板」,它默认不跨文件、不激活正则、也不检查上下文。你点 Replace All,Sublime 只扫当前文件的可见区域(折叠行、注释块、字符串里都可能漏),更不会进 node_modules 或未打开的 .ts 文件。
真正跨文件批量操作,必须用 Ctrl+Shift+F(Windows/Linux)或 Cmd+Shift+F(macOS)调出「Find in Files」面板。别跳过这一步——这是所有误操作的起点。
- 确认左下角状态栏显示项目路径(如
/Users/xxx/my-project),否则说明没加载项目:必须通过File → Open Folder…加载整个目录,不能只打开单个文件 -
Where框里别留空,也别填./(会扫全盘);推荐写src,-node_modules(逗号分隔,减号排除)或**/*.js - 点
Find后先看底部匹配列表数量和位置,数量异常就立刻停手
正则模式没生效?检查 .* 和 ↩ 两个开关是否都开了
Sublime 的正则不是“写了就算”,而是严格依赖两个独立开关:.*(启用正则语法)和 ↩(允许 . 匹配换行符)。这两个按钮在 Ctrl+H、Ctrl+Shift+F、Ctrl+F 三个面板里各自独立,必须分别点开。
常见失效现象:\d+ 搜不到数字、^import 不匹配行首、console\.log$$[^)]*$$ 替换后原样输出——八成是 .* 没点蓝,或者没勾选 ↩ 导致 . 卡在单行内。
- 手动点右下角
.*图标(变蓝才算);或按Alt+R(Win/Linux)/Cmd+Alt+R(macOS)切换 - 跨行匹配必须额外勾选
↩,或在正则开头加(?s)(如(?s)function.*?) - 想让
^和$匹配每行首尾,得加(?m),否则它们只锚定全文开头结尾 - Windows 下换行符是
\r\n,$默认停在\r前,建议统一用\R(Sublime 内置通用换行符)
怎么避免把 user_name 错替成 userName 还顺手干掉 username
\buser_name\b 在 Sublime 里根本不管用——它的 \b 把下划线 _ 和数字当单词字符,所以 username 会被完整匹配进去。这不是 bug,是 Sublime 正则引擎对 Unicode 边界的定义方式。
安全做法不是靠 \b,而是用负向断言或上下文限定:
- 用
(?:明确排除前后紧邻字母数字(注意 Sublime 不支持 <code>(? 中文,但英文变量名够用) - 配合
Whole Word开关 + 空格前缀:user_name(前后带空格),再人工扫一眼结果,尤其注意行首、注释、字符串里是否被误卷入 - 若目标仅限 JS 变量声明,可限定左侧为
const|let|var|\s,右侧为\s|;|,|=,比如(?:const|let|var|\s)user_name(?=\s|;|,|=) - 别信“看起来像”,
console\.log出现在 JSON 字符串"console.log"里照样被换——正则不理解代码语义
Replace All 之后文件没变?你只是没保存
点完 Replace All,所有被改的文件标签页出现星号 * 是正常现象。Sublime 只把变更缓存在内存里,**不自动写入磁盘**。关掉窗口、崩溃、甚至切到其他应用再回来,改动全丢,且没有跨文件撤销历史。
必须手动执行保存动作:
- 菜单操作:
File → Save All - 快捷键:Windows/Linux 按
Ctrl+K松开,再按Ctrl+B;macOS 按Cmd+K松开,再按Cmd+B - 大文件(>10MB)可能被跳过,右下角看编码是否为
UTF-8;GBK 文件需先右键转码再操作 - 某次替换后部分文件没变?先检查它们是否是只读(右下角显示
RO),或是否被Where路径过滤掉了(比如写了**.ts却想改.js)

















