ctrl+shift+f(windows/linux)或cmd+shift+f(macos)是唯一跨文件批量替换入口,对应「find in files」面板;需确保已进入项目模式、where填“. ”、正则正确开启并转义元字符、替换后手动save all。

Ctrl+Shift+F 是唯一能跨文件批量替换的入口
按 Ctrl+H 只改当前文件,点 Replace All 也白搭。真正批量改多个文件,必须用 Ctrl+Shift+F(Windows/Linux)或 Cmd+Shift+F(macOS)。这个面板叫「Find in Files」,不是「Find」——菜单里找错位置、快捷键被系统占用(比如 macOS 的 Spotlight)、或插件劫持了绑定,都会导致面板打不开或灰显。
先确认左下角状态栏是否显示项目路径(如 ~/my-project/),没有就说明没进项目模式:菜单 → Project → Add Folder to Project…,选中你的代码根目录;否则 Where 框填什么都搜不到真实文件。
-
Where填.表示整个项目(不是./,也不是留空) - 只改业务代码更安全:
src/**/*.js, tests/**/*.ts(逗号分隔,不加空格) - 排除干扰:
., -node_modules/, -dist/, -*.min.js - 搜已打开但未保存的标签页?必须手动填:
open_files
正则模式不手动开,$1 就是字面量
.* 图标在面板右下角,灰色=关闭,蓝色=生效。它和 Ctrl+F、Ctrl+H 的正则开关是各自独立的——你在查找面板开了,不代表 Ctrl+Shift+F 面板也开了。没点开时写 console\.log\(([^)]+)\) 并填 debugger(),结果只会原样输出 debugger(),不会代入捕获内容。
- 捕获组必须用
$1、$2,不是\1;$0表示整个匹配 - 括号、点、星号等元字符要转义:
console\.log\([^)]*\) - 中文、Unicode 不用额外转义,但文件编码得是
UTF-8(右下角应显示该字样) - 想跨行匹配?勾选左下角
.matches newline,或正则开头加(?s)
整词匹配和边界处理比想象中脆弱
\buser_name\b 在 Sublime 里对下划线和数字不敏感,username 也会被命中。这不是 bug,是它的 \b 定义只认字母/数字/下划线为“词”,所以 _ 和 user_name 中的 _ 被视为词内连接符。
- 更稳的写法:
(? - 或者退一步,配合
Whole Word选项 + 空格前缀:user_name(注意前后空格) - 重命名变量时,别只靠正则:先限定
Where为**.js,再加(var|let|const)\s+user_name\b,确保只改声明处 - 注释、字符串、正则字面量里的
user_name依然会被换——正则不理解语法上下文
替换完不保存,等于什么都没做
点完 Replace All,所有文件标签页都带星号 *,这是正常现象。Sublime 把变更全缓存在内存里,没写入磁盘。关掉窗口、崩溃、甚至切到其他应用再切回来,修改就丢了。
- 必须手动执行
File → Save All,或快捷键:Ctrl+K然后Ctrl+B(Windows/Linux);macOS 是Cmd+K→Cmd+B - 大文件(>10MB)可能被跳过,看右下角编码是否为
UTF-8;GBK 文件得先右键「Reopen with Encoding → GBK」再操作 - 某文件没变?检查是否只读(右下角显示
RO),或是否被Where路径过滤掉了(比如写了**.ts却想改.js) - 复杂替换前,务必
git commit或备份——Sublime 没有跨文件撤销历史
Replace All 前,先 Find All 看满屏匹配项是否都在你预期的位置。











