sublime全局搜索必须用ctrl+shift+f(macos为cmd+shift+f),关键在where输入框:填“.”搜整个项目,用逗号分隔多类型如.js,.ts,减号排除目录如-/node_modules/,感叹号精确排除文件如!*.d.ts,且需项目已加载、索引刷新。

Ctrl+Shift+F 的 Where 输入框才是关键入口
Sublime 的全局内容搜索(不是文件名)必须用 Ctrl+Shift+F(macOS 是 Cmd+Shift+F),但默认它会扫所有可读文件——包括 node_modules、.git、dist/,结果被噪音淹没。真正控制“只搜指定格式文件”的地方,是搜索面板右下角的 Where 输入框,不是设置项,也不是右键菜单。
填错格式就等于没过滤:它不接受正则,只认 Shell glob 语法;不支持 **/*.js 这种双星号递归写法(Sublime 不支持),也不接受 src/**/*.ts 这类常见误写。
-
.表示整个项目根目录(必须写在最前,不能省略) - 限定后缀:写成
./src/*.py只搜src/下一级的.py文件;./src/**/*.py在 Sublime 中无效,应改用./src/*.py, ./src/*/*.py, ./src/*/*/*.py多段显式列举 - 多个类型用逗号分隔:
., *.js, *.ts, *.py—— 注意逗号后必须跟一个空格 - 排除目录必须加减号:
., -/node_modules/, -/dist/,-/node_modules少了结尾/就不生效
为什么 folder_exclude_patterns 对全局搜索无效
很多人在 Preferences → Settings – User 里加了 "folder_exclude_patterns": ["node_modules"],却发现 Ctrl+Shift+F 依然在 node_modules 里翻结果。这是因为 folder_exclude_patterns 只影响「索引构建」:它决定哪些文件夹进侧边栏、Ctrl+P 能否跳到、Ctrl+Shift+R 是否列出文件——但它完全不干预 Find in Files 的物理扫描路径。
换句话说:即使你在侧边栏看不到 node_modules,只要它物理存在且没被 Where 显式排除,搜索照样进去读每个文件,还可能因二进制内容卡顿或报错。
- 永久排除需两步:在
Where里临时写-, -/node_modules/,再在.sublime-project的folders数组里配"folder_exclude_patterns": ["node_modules"] - 配在用户设置里对搜索无影响,仅对索引和 UI 展示起作用
-
binary_file_patterns会悄悄让搜索变慢或跳过某些匹配,哪怕你已排除目录——它优先级更高,建议检查是否误加了"*.min.js"或"*.zip"
搜 .js 和 .ts 但不搜 .d.ts 或 .test.ts?用 ! 前缀精确排除
Where 支持 ! 前缀做「否定匹配」,比减号更灵活,适合按文件名模式排除。比如你想搜所有源码 JS/TS,但跳过类型声明和测试文件,可以这样写:
., *.js, *.ts, !*.d.ts, !*.test.ts, !*.spec.ts
注意:! 规则是逐个匹配文件名(不含路径),所以 !test_*.ts 有效,但 !src/test/*.ts 无效——Where 不解析路径层级,只做 basename 级过滤。
-
!和-可混用:., -/build/, !*.min.js - 大小写敏感:Linux/macOS 下
!*.TEST.TS不会排除foo.test.ts - 通配符只支持
*和?,不支持[a-z]或** - 想排除某类文件但保留同名目录?不行。
!*.log会跳过所有xxx.log文件,不管它在哪儿
搜不到刚新建的 .py 文件?不是搜索问题,是索引没刷新
如果你在项目里新建了 utils/helpers.py,然后在 Where 填了 ., *.py 却搜不到内容,大概率不是语法或路径问题,而是 Sublime 的索引缓存没更新。它不监听文件系统变化,新建、重命名、删除都不会自动触发重建。
必须手动执行:Ctrl+Shift+P → 输入 Refresh Folders → 回车。等右下角状态栏短暂显示 Indexing files... 消失后,再试搜索。
- 只用
Rebuild Index不够,它只刷新符号索引(影响Ctrl+Shift+R和@跳转),不影响Find in Files的文件列表 - 确认项目已加载:左下角必须显示类似
~/my-project/的路径,否则Where里的.根本没意义 - 如果文件被
file_exclude_patterns拦截(比如你设了"*.tmp"但误写了"*.py"),它连索引都不会进,自然搜不到
Where 语法,而是记住它和 folder_exclude_patterns、file_exclude_patterns、binary_file_patterns 四者各自管哪一段——它们不叠加、不替代、不继承,只是在不同阶段各扫各的地。漏掉任意一层,都可能让你在错误的地方反复调试。











