Ctrl+Shift+H(Win/Linux)或Cmd+Shift+H(macOS)是VSCode全局替换快捷键,需先通过Ctrl+Shift+F打开搜索面板并执行Find All,再展开替换框;正则引用用$1而非\1,且须手动保存。

Ctrl+Shift+H(Windows/Linux)或 Cmd+Shift+H(macOS)是真正起效的全局替换快捷键,不是 Ctrl+Shift+F —— 后者只查不换,按了也没法填替换内容。
为什么 Ctrl+Shift+F 不能直接替换
Ctrl+Shift+F 打开的是「在文件中查找」面板,它默认没有替换框。很多人卡在这一步,以为自己在做全局替换,其实只是在搜索。必须点击搜索框右侧的「替换」箭头图标(或按 Ctrl+Shift+H 直接跳转),才能展开替换输入框。如果面板右上角显示灰色「文档」图标,说明它还卡在当前文件模式,得手动点 ⋯ → 勾选「在文件中查找」,或再按一次 Ctrl+Shift+H 强制切到全局。
替换前必须手动点「Find All」,否则 Replace All 不生效
VSCode 的 Replace All 按钮只作用于当前已加载的匹配项,不是实时扫描。常见翻车场景:
- 输完查找和替换内容后直接点
Replace All,结果只改了前几行——因为还没触发完整匹配扫描 - 搜索范围设了
src/**/*.ts,但部分文件没被打开过,VSCode 不会主动加载它们,这些文件里的匹配项根本不会出现在列表里 - 点了
Replace All后标题栏出现 ● 圆点,但 Git 状态没变化——说明编辑器内存已改,但文件没写入磁盘,必须按Ctrl+S或Ctrl+K S(保存所有)
正则替换时 $1 要写对,\1 是无效的
VSCode 使用 JavaScript 正则引擎,捕获组引用只认 $1、$2,写 \1 会被当普通文本处理,界面不报错、也不替换,静默失败。
例如想把 class="btn" 替成 class="btn is-primary":
- 查找填:
class="([^"]+)" - 替换填:
class="$1 is-primary"✅ - 替换填:
class="\1 is-primary"❌(原样保留\1) - 要字面输出
$1,得写成$$1
另外,.* 按钮必须点亮才启用正则;如果想跨行匹配,还得勾选旁边的 .(dotAll)按钮,否则 . 不匹配换行符。
限定文件范围时,包含/排除规则要手写,别依赖图形按钮
「包含文件」和「排除文件」输入框支持 glob 模式,但 VSCode 的漏斗图标菜单容易误导人:点「Add pattern」后弹出的选项常缺你想要的路径。最稳的方式是直接手写:
- 只改 Vue 文件:
**/*.vue - 只改 src 下的 CSS:
src/**/*.css - 排除 node_modules 和 dist:
!node_modules,!dist - 组合写法(推荐):
src/**/*.{ts,js,tsx}
注意:!node_modules 必须写在「排除文件」里,写在「包含文件」中无效;而且排除规则优先级高于包含,顺序不重要,但漏写 ! 就会变成包含。
全局替换真正难的不是按键,而是确认哪些文件该进、哪些该挡、哪些匹配是真实的——尤其在大项目里,一个没关的 Aa(大小写敏感)或没点的 .*,就能让整批替换看起来“没反应”。


















