ctrl+shift+h没反应是因卡在“当前文件”模式,需再按一次或勾选「在文件中查找」;replace all不保存需手动ctrl+s;正则引用必须用$1,非\1;未打开文件不参与替换。

Ctrl+Shift+H没反应?先看右上角是不是“在当前文件中查找”
VSCode 的 Ctrl+Shift+H(Windows/Linux)或 Cmd+Shift+H(macOS)默认应打开全局替换面板,但很多人按下后只在当前文件里搜——面板右上角显示灰色“文档”图标,说明它卡在「在当前文件中查找」模式。这不是快捷键失效,是状态残留。
解决方法只有两个:
• 再按一次 Ctrl+Shift+H,强制切回全局模式
• 或点搜索面板右上角的 ⋯ → 勾选「在文件中查找」
别指望快捷键自动重置,手动干预最稳。尤其当你刚从 Ctrl+F 切换过来时,这个状态极容易被继承。
Replace All点了没变化?你根本没写入磁盘
VSCode 的「全部替换」只改编辑器内存,不自动保存到文件系统。标题栏出现 ● 圆点 ≠ 已落盘,必须手动 Ctrl+S(或 Cmd+S)才能真正写入。
更隐蔽的问题:
• 没打开过的文件(比如 src/api/legacy.ts)不会被加载进编辑器,Replace All 对它们完全无效
• 如果右下角显示 Read-only,替换按钮会灰掉,得解除只读或用管理员权限重启 VSCode
• 替换后立刻看 Git 状态,没看到改动,八成就是漏了 Ctrl+S
正则替换总失败?$1 和 \1 不是一回事
VSCode 用的是 JavaScript 正则引擎,捕获组引用只认 $1、$2,写 \1 或 $$1 会静默失效——界面不报错,也不替换,只是原样保留。
常见翻车点:
• 查 class="([^"]+)",替换填 class="$1 is-primary" ✅;填 class="\1 is-primary" ❌
• 要字面量输出 $1,得写成 $$1
• 中文括号、全角引号、未转义的 . 或 / 会导致正则静默失效,建议先关掉 .* 按钮确认普通文本能搜到,再逐步加正则
• .* 按钮默认不跨行;如需匹配多行,勾选它旁边的 dotAll 模式,或用 [\s\S]* 替代
为什么某些文件没被替换?检查 search.exclude 和文件是否被过滤
VSCode 默认跳过 node_modules、.git、dist 等目录,靠的是 search.exclude 配置。但如果你自定义过这个配置,或项目里有 .vscode/settings.json,就可能意外排除了本该参与替换的目录(比如 src/api 被写进了 exclude 规则)。
排查步骤:
• 打开命令面板(Ctrl+Shift+P)→ 输入 Preferences: Open Settings (JSON) → 查看是否有 search.exclude 或 files.exclude 条目
• 临时绕过过滤:在搜索面板右上角点击 ⋯ → 取消勾选「使用排除设置」(仅本次生效)
• 路径通配符注意:**/test/** 会排除所有含 test 的子目录,而 test/** 只排除顶层 test/ 目录
真正容易被忽略的是:全局替换依赖预加载——没打开过的文件,即使路径匹配,也不会被 Replace All 触及;而一旦你手动打开过某个文件,它就会进入编辑器缓存,下次替换才可能生效。这和「搜索结果列表是否显示该文件」不是一回事。











