ctrl+shift+h 默认打开“替换面板”且需确保处于全局模式;replace all 不自动保存,须手动 ctrl+s 或开启 auto save;正则引用用 $1 而非 \1;范围限定应显式填写 glob 模式。

Ctrl+Shift+H 打开的是“替换面板”,不是“搜索面板”
很多人按 Ctrl+Shift+H 后发现只高亮了当前文件里的内容,或者根本没反应——这是因为 VSCode 默认把 Ctrl+Shift+H 绑定到「在文件中替换」(Replace in Files),但它依赖面板右上角的状态图标是否为「文件夹」图标。如果显示的是「文档」图标,说明它卡在单文件模式,此时所有操作都只作用于当前打开的文件,哪怕你填了 src/**/*.ts 也无效。
解决方法只有两个:
• 再按一次 Ctrl+Shift+H 切换回全局模式
• 或点面板右上角 ⋯ → 勾选「在文件中查找」
别指望快捷键自动重置状态,手动干预最稳。
“全部替换”不等于“已保存”,漏存=白干
Replace All 按钮只修改编辑器内存中的文本,不会写入磁盘。标题栏出现 ● 圆点 ≠ 已保存,只是表示有未保存更改。Git 看不到任何 diff,八成是这个原因。
必须手动执行:
• Ctrl+S(单文件)
• 或 Ctrl+K S(保存所有已修改文件)
• 更稳妥的做法是提前开启 File > Auto Save 并设为 afterDelay
还有一个隐藏陷阱:没被 VSCode 加载过的文件(比如从未打开过、或被 files.exclude 隐藏的)根本不会参与 Replace All,界面也不会提示。
正则替换里 $1 和 \1 完全不同,写错就静默失败
VSCode 使用 JavaScript 正则引擎,捕获组引用只认 $1、$2,写成 \1 或 $$1 都不会报错,但也不会替换——它会原样保留查找内容,让你以为“没匹配上”。
典型翻车场景:
• 查:class="([^"]+)",替换成 class="\1 is-primary" → 失败(\1 不生效)
• 正确写法:class="$1 is-primary"
• 要字面输出 $1,得写成 $$1
另外:.* 按钮默认不跨行;想匹配换行符,得额外勾选旁边的 .(dotAll)按钮,或改用 [\s\S]*。
限定范围不靠猜,靠显式填写 glob 模式
光填 *.ts 很容易误扫 node_modules/@types 或 dist/ 下的声明文件。真正安全的做法是:
- 在「包含文件」里写明确路径,比如
src/**/*.ts,而不是泛泛的*.ts - 在「排除文件」里加
!node_modules/**/*、!dist/**/*、!**/*.d.ts - 不确定时,先点「包含文件」旁的 … → 「Add pattern」,再选目录,比手输更少出错
还有个易忽略点:Mac 上 Cmd+Alt+F 可能被系统快捷键拦截,实际应统一记作 Cmd+Option+F(Option 键即 Alt 键),文档里都写作 Cmd+Option+F。











