ctrl+shift+h 打开的是「在文件中替换」视图,需手动配置 files to include(如 .ts)和 exclude(如 node_modules),正则需点击 . 图标启用,$1 仅在替换框有效,全部替换前须先重新查找。

Ctrl+Shift+H 打开的是全局替换面板,不是搜索面板
很多人误以为 Ctrl+Shift+H(Win/Linux)或 Cmd+Shift+H(macOS)只是“带替换功能的搜索”,其实它直接启动的是「在文件中替换」(Replace in Files)视图,一打开就默认准备执行跨文件替换。它和 Ctrl+Shift+F 的区别在于:后者只做查找,前者从一开始就把「替换」作为核心动作——输入框下方立刻出现「files to include」和「files to exclude」字段,范围控制是内置前提,不是可选项。
“包含文件”必须手动填 *.js、*.ts 等 glob 模式
VSCode 不会自动猜你要改哪类文件。不填 files to include,它就按默认工作区全扫,包括 node_modules、dist、.git 下的文件(哪怕这些目录本该被排除)。常见错误是只输 .ts 或 ts,结果没匹配到任何文件——必须用通配符:*.ts 是最低要求;更安全写法是 src/**/*.ts 或 **/*.vue。
-
**/*.css匹配所有子目录下的 CSS 文件 -
{src,tests}/**/*.py同时限定两个根目录 - 多个模式用英文逗号分隔:
*.js,*.ts - 留空则等同于未设限制,风险极高
排除 node_modules 等目录不能只靠默认设置
VSCode 默认排除 node_modules,但这个行为只在 Ctrl+Shift+F(纯搜索)中稳定生效;一旦用了 Ctrl+Shift+H 进入替换流程,它会忽略部分默认排除规则,尤其当 files to include 已填写时。所以必须显式填进 files to exclude:
-
node_modules(不加斜杠,VSCode 会自动识别为目录) -
dist,build,.next,out(多个路径用英文逗号分隔) -
**/legacy/**(排除某类子路径) - 注意:如果
files to include填了src/**/*.ts,那node_modules其实不会被扫到——但保险起见仍建议加上
正则替换前必须点 .* 图标,且 $1 引用只在替换框里有效
启用正则不是靠记忆快捷键,而是看右上角 .* 图标是否变蓝,并出现 “Regex” 标签。没点亮时,哪怕你写了 (\w+)\.value,它也当普通字符串搜,不会捕获分组。
- 查找框里写
console\.log\(["'](.+?)["']\),替换框里必须写debugger; // $1(不是\1) -
$&表示整个匹配内容,比依赖编号更稳,适合不确定括号嵌套层级时 - 想字面输出
$abc,得写成$$abc,否则会被当成未定义的捕获组而丢弃 - 点了
.*却搜不到?检查是否误点了旁边的↵(跨行匹配)——它会让.匹配换行符,通常不需要,反而导致性能骤降或误匹配
真正容易被忽略的点是:VSCode 的「全部替换」按钮只作用于当前已加载的匹配项列表,而这个列表不会动态刷新。如果你改了 files to include 再直接点「全部替换」,它仍按旧范围执行——必须先回车或点「查找」重新生成结果集,再操作。











