Ctrl+Shift+H(Win/Linux)或Cmd+Shift+H(macOS)是VSCode唯一直接打开全局“在文件中替换”视图的快捷键,误用Ctrl+H仅限当前文件,Ctrl+Shift+F需手动展开替换框;默认扫描整个工作区,须配置files to include/exclude、启用.*正则开关,并确保非只读状态及已保存。

Ctrl+Shift+H 是唯一正确的全局替换入口
不是 Ctrl+H,也不是 Ctrl+Shift+F,只有 Ctrl+Shift+H(Windows/Linux)或 Cmd+Shift+H(macOS)会直接打开带替换框的「在文件中替换」视图。误用 Ctrl+H 只改当前文件;Ctrl+Shift+F 默认只搜索,必须手动点右上角 ↓ 箭头才能展开替换框——这一步常被跳过,导致“点了全部替换却没反应”。
-
Ctrl+Shift+H打开即进入可替换状态,右侧有.*、Aa、\b三个关键开关,不用二次操作 - 光标必须落在可编辑文本区域,若状态栏显示 Read-only,替换按钮会灰掉
- 首次打开时默认扫描整个工作区,包括
node_modules和dist—— 但 VSCode 实际已按search.exclude配置自动过滤,你未必知道它拦了哪些目录
不填“包含文件”,等于没限定范围
空着「文件包含」(files to include)框,VSCode 就按默认规则扫所有可读文件。你以为它只扫 src,其实它可能正悄悄匹配 package-lock.json 或 .eslintrc.cjs 里的字符串。真正安全的做法是立刻填上明确 glob 模式。
- 只改 TypeScript 文件:填
*.ts或更精准的src/**/*.ts - 只改 CSS 类名:填
**/*.css,避免误触index.html中的内联 style - 想排除 legacy 目录:在「文件排除」框填
**/legacy/**,注意末尾/**才能递归排除子目录 - 多个模式用英文逗号分隔,例如
src/**/*.ts,tests/**/*.spec.ts
正则替换前必须手动点 .* 图标或按 Alt+R
VSCode 的正则引擎基于 ECMAScript,不支持 \K、(? 等 PCRE 特性,但基础功能完全够用——前提是它真被启用了。图标没变蓝、右下角没显示 <strong>Regex</strong> 标签,就等于正则根本没生效,哪怕你写了 <code>\d+ 也只会当字面量 d+ 去搜。
- 启用后,捕获组必须用
$1引用,\1会被当普通文本处理 - 要输出字面量
$,必须写成$$;$$1abc表示字面量$1abc,不是捕获组加文本 - 点错
↵(dotAll)图标会导致.匹配换行符,常引发跨行误匹配,除非你明确需要 - 中文括号、全角符号、未转义的
.或/会让正则静默失败——先关.*试普通文本,再逐步加正则
Replace All 不等于写入磁盘
点击「全部替换」后,VSCode 只修改编辑器内存中的内容,文件系统毫无变化。标题栏出现 ● 圆点 ≠ 已保存,Git 也不会检测到任何差异。很多人替换了二十个文件,一刷新发现全回滚了,就是因为没按 Ctrl+S。
- 没打开过的文件不会被加载进编辑器,
Replace All对它们完全无效 - 建议开启
File > Auto Save并设为afterDelay,避免漏存 - 替换后立刻看 Git 状态,没看到改动,八成是没触发真实写入
- 复杂重构务必先
git commit当前状态,替换后再用git diff快速核对变更范围
Replace All 前,有没有花三秒确认路径、正则和上下文——尤其当匹配项里混着 config.API_URL 和 user.api_url 这种语义不同但字符串相似的内容。


















