Ctrl+Shift+H(Windows/Linux)或Cmd+Shift+H(macOS)是VS Code全局替换唯一入口;Ctrl+H仅限当前文件,未点Find All则Replace All会漏匹配;正则需点.*图标启用,捕获组用$1而非\1。

Ctrl+Shift+H 是全局替换的唯一入口,不是 Ctrl+H
很多人卡在第一步,是因为误以为 Ctrl+H(当前文件替换)能跨文件生效。它只作用于当前编辑器标签页,哪怕你开了 20 个 .ts 文件,Ctrl+H 也只会改光标所在的那个。真正触发「整个工作区批量替换」的快捷键只有 Ctrl+Shift+H(Windows/Linux)或 Cmd+Shift+H(macOS)。注意:Mac 上的 Cmd+Option+F 是当前文件「查找并替换」,和全局无关;Cmd+Alt+F 是物理等价写法,但文档统一用 Cmd+Option+F,别被键盘标识搞混。
“包含文件”不填,就等于扫整个工作区(含 node_modules)
按下 Ctrl+Shift+H 后,VS Code 默认把搜索范围设为当前打开的工作区根目录——这意味着它会递归遍历所有子文件夹,包括 node_modules、dist、.git 等。你没手动填 files to include,它就真会去里面找匹配项,轻则卡顿几十秒,重则误改依赖包里的代码。
- 限定 Vue 文件:在
files to include输入*.vue或src/**/*.vue - 限定 TypeScript 文件:填
**/*.ts,再在files to exclude补上**/*.d.ts - 排除干扰目录:直接在
files to exclude填node_modules, dist, build
正则替换必须点 .* 按钮,$1 才有效,\1 是错的
VS Code 的正则引擎是 JavaScript 风格(ECMAScript),不支持 \K、\R 等 PCRE 特性。启用正则的关键动作是点击搜索框右侧的 .* 图标(变蓝才算开启),否则你写的 (\w+) 就只是普通括号,不会生成捕获组。
- 捕获组编号从左到右严格计数:
import\s+(\w+)\s+from\s+['"](.+?)['"]中,$1是模块名,$2是路径;(?:...)是非捕获组,不占编号 - 替换字段里写
\1不会回填内容,必须写$1;要字面输出$abc,得写成$$abc - 跨行匹配需要额外点
.按钮(图标是带换行符的点),否则.不匹配换行符,\n才能生效
Replace All 不实时扫描,漏匹配的根源在这里
Replace All 按钮只对当前已列出的匹配项生效,它不会重新跑一遍全文扫描。如果你输完搜索内容后没点 Find All(放大镜图标),或者中途修改了搜索词但没再点一次,面板里显示的匹配数就是过期的——可能只列出了前 100 个,后面几百个根本没加载出来,Replace All 就直接跳过了。
- 每次修改搜索内容或范围后,务必手动点一次
Find All - 如果匹配项太多导致卡顿,先加更严格的
files to include或启用Aa(区分大小写)缩小范围 - 对关键重构,宁可点
Replace(单个箭头)逐个确认,也别迷信Replace All
实际执行时最容易被忽略的,是「点 Find All」这个动作本身——它没有视觉反馈,不像按钮按下去有动效,但它是确保全部匹配项被载入的唯一前提。


















