全局替换必须基于已加载的文件夹工作区,否则仅作用于单个文件;Ctrl+Shift+H无反应或只搜当前文件,是因为右下角显示“No folder opened”或仅一个文件名,需通过File→Open Folder…打开项目顶层目录。

全局替换在 VSCode 中必须基于已加载的文件夹工作区,否则操作只作用于单个打开的文件——这是 90% 替换“没生效”的根本原因。
为什么 Ctrl+Shift+H 没反应或只搜当前文件
VSCode 的 Ctrl+Shift+H(macOS 为 Cmd+Shift+H)默认只对“已打开的文件夹”生效。如果右下角状态栏显示 No folder opened 或只显示一个文件名(如 index.ts),说明你处于空工作区或单文件模式。
- 必须通过
File → Open Folder…打开项目顶层目录(如my-app/),不能用Open File…加载单个文件 - 多根工作区需确认所有文件夹都已加入且无感叹号图标(表示路径无效)
- 临时验证:打开任意一个子目录下的文件,按
Ctrl+Shift+H后看左上角是否显示该文件夹路径
如何限定替换范围到指定文件夹
“在文件中替换”面板右上角有漏斗图标(⋯),点击后展开 files to include 和 files to exclude 输入框,这里才是控制物理范围的关键。
- 想只改
src/utils下所有文件:在files to include填src/utils/**/* - 想排除
node_modules但又需要临时改它:清空files to exclude,或点击右侧Use Exclude Settings取消勾选(仅本次生效) - 路径通配符陷阱:
**/api/**会匹配src/lib/apiClient,而src/api/**才精准锁定顶层api目录
替换后文件没更新?检查写入机制和只读状态
Replace All(单个向右箭头)只是内存修改;真正写入磁盘的是 Replace in Files(两个重叠文档图标),它会自动加载未打开的命中文件并保存。
- 未打开的文件永远不会被
Replace All触达 - 若某文件右下角显示
Read-only,Replace in Files会跳过它,需手动解除只读或以管理员权限运行 VSCode - 即使替换了,文件标题栏出现 ● 圆点也不代表已落盘——必须执行
Save All(Ctrl+K S)或启用Auto Save
正则替换时捕获组和特殊字符怎么写才对
VSCode 使用 ECMAScript 正则引擎,$1、$2 可用,但 $0 不存在,\n 在替换字段中是字面换行符,不是字符串 "\n"。
- 搜索
(import\s+\w+)\s+from\s+['"](.+?)['"],替换为$1 from '$2'是安全的 - 要输出字面量
$,得写成$$;想插入换行符,替换字段直接按Enter,不要输\n - 启用正则前务必先点
Enter或Find All预览结果——VSCode 不提供 diff 预览,误替换无法撤回(除非 Git 已跟踪)
最易被忽略的一点:search.exclude 是静默拦截器,它不提示、不报错,只默默跳过匹配路径。哪怕你正在 patch node_modules 里的一个 .d.ts 文件,只要路径被 **/node_modules/** 覆盖,它就彻底消失在搜索结果里——得主动点开 ⋯ → Use Exclude Settings 关掉才行。


















