search.exclude必须用glob模式(如"/docs"、"/*.md")显式匹配自动生成文档路径,且需重载窗口或清除索引缓存才生效;files to exclude输入框优先级更高,非空时会覆盖search.exclude。

search.exclude 必须写对 glob 才能排除自动生成文档
VSCode 不会自动识别“自动生成文档”这类语义,必须靠 search.exclude 显式匹配其路径或后缀。常见生成文档如 docs/、api-docs/、**/*.md(若文档是 Markdown)、**/generated/ 等,都得手动写进配置,否则照样出现在 Ctrl+Shift+F 结果里。
关键点:路径必须用 glob 模式,且几乎总要带 **/ 前缀,否则只匹配根目录下同名项。比如 "docs" 只跳过项目根下的 docs/,但 packages/core/docs/ 仍会被扫到。
-
"**/docs"✅ 覆盖所有层级的docs目录 -
"**/api-docs"✅ 排除 Swagger 或 TypeDoc 输出目录 -
"**/generated/**"✅ 排除 Protobuf、GraphQL Codegen 等产出的代码目录 -
"**/*.md"✅ 如果文档是 Markdown 文件(注意不是"*.md",后者只作用于根目录) -
"**/README.md"✅ 单独排除所有 README(不是"README.md")
为什么改了 search.exclude 还搜出 docs/?先查 files to exclude 输入框
搜索面板右上角的 Files to exclude 输入框优先级高于 search.exclude。如果它非空(哪怕只填了一个空格),VSCode 就会忽略你所有的 search.exclude 规则,只按这个输入框的内容过滤。
现象:明明 .vscode/settings.json 里写了 "**/docs": true,但搜关键词还是冒出一堆 docs/api/index.html 里的内容。
- 打开搜索面板 → 点右上角
⋯→ 找Files to exclude输入框 - 清空它,或确认里面没误填
!**/docs这类显式包含规则 - 如果临时想包含 docs,直接清空比加
!更可靠——!容易写错格式,比如多空格或漏引号
排除 .md 文档但保留源码中的 .md?别用 files.exclude
files.exclude 控制侧边栏是否显示文件,不影响搜索;而 search.exclude 专管 Ctrl+Shift+F。想让文档不进搜索结果,但又希望它们在资源管理器里可见(比如要编辑 README),就只能配 search.exclude,不能动 files.exclude。
反例:"files.exclude": { "**/*.md": true } —— 这会让所有 .md 在侧边栏消失,但全局搜索依然会扫出来。
- 正确做法:只在
search.exclude里加"**/*.md": true - 如果只想排除特定目录下的
.md(比如只排除docs/下的,保留src/下的),写"**/docs/**/*.md": true,而不是笼统的"**/*.md" - 注意:VSCode 不支持按文件内容判断是否“自动生成”,所以没法写 “排除含 ‘Auto-generated’ 字样的 .md”——只能靠路径或命名规律
修改后不生效?重载窗口比重启更关键
VSCode 搜索依赖本地索引缓存,改完 search.exclude 后不会自动重建索引。尤其在大型项目里,旧缓存可能持续返回已被排除路径下的文件,导致你以为配置失效。
- 按
Ctrl+Shift+P→ 输入Developer: Reload Window→ 回车(保留所有标签页,比关掉再开快) - 或者删掉项目下的
.vscode/.search文件夹(如果存在),强制重建索引 - 重启 VSCode ≠ 重载窗口;单纯关掉再打开,索引缓存大概率还在
- 检查工作区是否为多根(monorepo):规则必须写在
.code-workspace的settings字段里,写在某个子包的.vscode/settings.json中无效
最常被忽略的是路径前缀和缓存刷新——**/ 不是可选项,Reload Window 不是可跳过步骤。这两处任一出错,配置就等于白写。











