ctrl+shift+h(win/linux)或cmd+shift+h(macos)是vscode全局替换快捷键,直接打开带替换框的视图;ctrl+h仅限当前文件替换,不可混淆。

Ctrl+Shift+H(Windows/Linux)或 Cmd+Shift+H(macOS)才是 VSCode 真正的全局替换入口,Ctrl+H 只改当前文件,按错就白忙。
Ctrl+Shift+H 和 Ctrl+Shift+F 到底用哪个?
Ctrl+Shift+F 是纯搜索快捷键,只找不换;点完它之后必须手动点右上角 ↓ 箭头(或按 Ctrl+Alt+Enter)才能呼出替换框——这步漏了,“全部替换”就根本不会响应。
Ctrl+Shift+H 一打开就是带替换框的视图,省去展开步骤,适合明确要批量改的场景。但别跳过预览:它默认扫整个工作区,node_modules、dist、.git 虽被 search.exclude 拦住,但你未必清楚它拦了哪些。
- 首次执行前,先点「files to include」旁的 … → 「Add pattern」,填
src/**/*.ts这类明确路径 - 如果搜完没结果,检查右下角是否显示灰色“文档”图标——那是卡在「当前文件」模式,再按一次
Ctrl+Shift+F或手动勾选「在文件中查找」 - Mac 用户注意:
Cmd+Alt+F可能被系统快捷键拦截,优先用Cmd+Shift+H
限定文件类型必须手动填 *.ts 或 *.css
不填「包含文件」,等于把替换权交给运气。VSCode 不会自动猜你想改哪类文件,哪怕你刚从一个 index.css 里复制的词。
- 只改 CSS 文件?在「包含文件」框里填
*.css或**/*.css - 只改 TypeScript?填
*.ts,想排除声明文件就再加一行到「排除文件」:**/*.d.ts - 想精准到目录?用
src/components/**.ts,注意双星号 ** 表示递归子目录 - 填错格式(比如漏了 * 或用了全角符号)会导致范围失效,匹配数为 0 却不报错
正则替换时 $1 生效的前提很具体
VSCode 用的是 ECMAScript 正则引擎,$1 能用,\1、${1}、$<name></name> 全部静默失败——界面不提示,也不报错,只是原样保留。
- 启用正则必须点
.*图标,或按Alt+R(Win/Linux)、Cmd+R(macOS),看到右下角出现Regex标签才算真开 - 捕获组括号必须英文半角、严格配对;
(?:)是非捕获组,不生成$1 - 要字面量输出
$abc,得写成$$abc;$1abc会被截成$1,后面 abc 直接丢弃 - 跨行匹配需额外点 ↵ 图标(或
Cmd+Option+M),否则^和$只匹配整个字符串首尾,不是每行
Replace All 不等于保存,Git 里看不到改动就是没落盘
点击「全部替换」后,编辑器标题栏出现 ● 圆点,只代表内容已改、未保存;VSCode 不会自动写入磁盘,也不会自动提交 Git。
- 必须手动按
Ctrl+S(或Cmd+S)才真正写文件 - 没打开过的文件(比如只在 Git 中存在、但没在编辑器里 tab 过的)不会被加载进内存,
Replace All对它们完全无效 - 建议操作前先
git commit -m "before bulk replace",替换后立刻git diff确认变更范围 - 某些项目里,CSS 类名或 import 路径改完后 UI 异常,不是替换错了,是样式层叠或模块解析逻辑变了——得人工验证关键页面











