Ctrl+Shift+F(Windows/Linux)或 Cmd+Shift+F(macOS)是VSCode全局替换唯一入口;Ctrl+H仅限当前文件,跨文件批量修改必须用前者,并需手动设置files to include/exclude、先点Find All再Replace All。

Ctrl+Shift+F 是全局替换的唯一入口,不是 Ctrl+H 的扩展
VSCode 里没有“全局版 Ctrl+H”——Ctrl+H(或 Cmd+Option+F)永远只作用于当前打开的文件。想跨文件夹批量改代码,必须用 Ctrl+Shift+F(Windows/Linux)或 Cmd+Shift+F(macOS)。很多人卡在第一步,是因为按了 Ctrl+H 后发现改不了其他文件,误以为功能失效。
这个面板默认聚焦在“搜索”框,光标一落进去就能输内容;但要注意:它不会自动把当前编辑器里的选中文本填进去,得手动复制粘贴或重新输入。
- 如果快捷键没反应,先确认焦点是否在编辑器内(终端、调试控制台、侧边栏都不行)
- Mac 用户注意:
Cmd+Option+F和Cmd+Alt+F是同一组物理按键,文档统一写作Cmd+Option+F,但系统设置里可能显示为 Alt - 插件(尤其是 Vim 模式)可能劫持该快捷键,可在命令面板运行
Preferences: Open Keyboard Shortcuts (JSON)检查是否有冲突规则
限定文件范围比盲目扫全工作区更安全高效
直接点 Replace All 前,务必点击右上角文件夹图标,在 files to include 里填明确路径模式,比如 src/**/*.ts 或 *.js。不设范围就执行,VSCode 默认扫描整个工作区——node_modules、dist、.git 全在里面,轻则卡顿,重则误改依赖包里的文件。
-
files to include和files to exclude可同时生效,推荐组合使用:比如填**/*.ts,再在 exclude 里加node_modules, dist, *.d.ts - 路径通配符支持
**(递归匹配),但不支持?或[abc]这类 shell 风格写法 - 如果项目用了多根工作区(multi-root workspace),搜索范围默认是全部根目录,需手动切换左上角工作区下拉菜单来限缩
正则替换时 $1 能用的前提是括号存在且编号连续
想把 log("msg") 改成 console.log("msg"),写查找正则 log$$([^)]+)$$、替换为 console.log($1) 才有效。这里 $1 不是变量名,是捕获组编号——第一个 (...) 对应 $1,第二个对应 $2,依此类推。
- 非捕获组
(?:...)不占编号,别指望它生成$1 -
\1在 VSCode 替换字段里无效,只会当普通文本输出;必须用$1 - 要字面输出
$abc,得写成$$abc,否则会被当成捕获组引用 - 启用正则后,
.默认不匹配换行符;如需跨行匹配,得勾选右下角的.按钮(跨行模式),但多数重构场景不需要它
Replace All 不是实时扫描,Find All 必须手动触发
Replace All 按钮只对当前已高亮的匹配项生效,而高亮结果来自你上次点击 Find All(或回车)的动作。如果你跳过这步直接点 Replace All,它可能只改了前几处,甚至一个都不动——因为面板根本没加载完整匹配列表。
- 每次修改查找内容或范围后,都得重新点
Find All刷新预览 - 左侧文件树里的匹配数是可信的,但右侧内容预览可能被折叠,记得展开检查上下文是否合理
- 遇到性能卡顿,优先检查
files to exclude是否漏了node_modules,其次看正则是否写了低效表达式(比如.*开头又没锚点)
files to exclude 没生效,或者 Find All 根本没点——这两处没确认,Replace All 就等于盲操作。


















