ctrl+shift+f是全局搜索入口,ctrl+shift+h才是专为全局替换设计的视图;前者需手动展开替换框,后者一步到位带搜索与替换双输入框,且替换前必须先执行find all,替换后须手动ctrl+s保存。

VSCode 全局替换不是按一个键就完事,必须分清 Ctrl+Shift+F 和 Ctrl+Shift+H 的用途——前者是搜索入口,后者才是专为替换设计的视图,混用会导致操作卡在“只搜不换”状态。
Ctrl+Shift+H 才是真正的全局替换入口
很多人误以为 Ctrl+Shift+F 能直接替换,结果输完内容点“全部替换”没反应。这是因为 Ctrl+Shift+F 默认打开的是「搜索」视图,它不带替换框;而 Ctrl+Shift+H(Windows/Linux)或 Cmd+Shift+H(macOS)才直接进入「替换」视图,左侧搜索、右侧替换,一步到位。
- Ctrl+Shift+F 后想替换,得先点搜索框右侧的「展开替换」箭头(或按 Ctrl+Alt+Enter),否则 Replace All 按钮压根不出现
- Ctrl+Shift+H 打开后,替换框默认聚焦,输入即写入,更符合“我要改”的直觉
- Mac 用户注意:Cmd+Alt+F 是当前文件替换(等价于 Cmd+Option+F),和全局无关,别和 Cmd+Shift+H 搞混
替换前不点 Find All,Replace All 就是盲操
VSCode 的 Replace All 不会实时扫描整个工作区,它只作用于当前已高亮的匹配项。如果你没手动触发搜索(按 Enter 或点 Find All),面板里空空如也,点 Replace All 也不会改任何东西——界面不报错,但文件纹丝不动。
- 首次输入搜索词后,务必按 Enter 或点面板顶部的
Find All按钮,确认下方列出的文件和行是你想要的 - 如果搜索范围太宽(比如扫了
node_modules),结果列表会卡顿甚至假死,此时应立刻点右上角文件夹图标,填src/**/*.ts这类精确路径 - 没看到预期匹配?先关掉
.*(正则)和.(跨行)按钮,切回纯文本模式试试——很多失败是因为正则写错却静默忽略
正则替换必须用 $1,\1 是无效的
VSCode 用的是 JavaScript 正则引擎,捕获组引用只认 $1、$2,写 \1 或 $$1 都不会报错,而是原样输出到文件里,导致“替换了但内容不对”。
- 查
console\.log\(["'](.+?)["']\),替换必须填debugger; // $1,填debugger; // \1就白忙 - 要字面输出
$abc,得写成$$abc;$0不可用,捕获组编号从$1开始 - 非捕获组
(?:...)不占编号,别指望它生成$1;括号数量和编号必须严格对应
Replace All 不等于保存,没 Ctrl+S 就没改
点击 Replace All 后,所有目标文件只是在编辑器内存里变了,标题栏出现 ● 圆点,Git 状态仍是干净的——这不是 bug,是 VSCode 的设计:它把“修改”和“写入磁盘”拆成两步。
- 批量替换完成后,必须手动按
Ctrl+S(或Cmd+S)保存,否则关掉编辑器就丢;Ctrl+Shift+S是保存全部,更保险 - 没打开过的文件(比如新生成的
dist下的 JS)根本不会被加载进编辑器,Replace All 对它们完全无效 - 如果右下角显示
Read-only,替换按钮会灰掉,得解除文件只读属性或用管理员权限重启 VSCode
最易被忽略的一点:全局替换没有预览 diff,也没有撤回机制。一旦点下 Replace All 并保存,就只能靠 Git 撤销——所以每次操作前,先提交一次当前分支,比什么都可靠。











