ctrl+p输入api*.ts能匹配apiclient.ts、apiservice.test.ts、src/api/v1/auth.ts等以api开头且含.ts的路径文件,但不匹配fetchapi.js或api.util.tsx;where框中src//*.ts无效,因sublime仅支持前缀匹配,不解析递归语法。

Ctrl+P 里输 api*.ts 能匹配哪些文件?
这是最常被误认为“通配符失效”的场景——其实 Ctrl+P 支持 *,但仅作字面通配,不支持正则或复杂 glob 语法。它本质是路径字符串的模糊前缀匹配 + 星号扩展。
输入 api*.ts 会命中:
-
apiClient.ts(api开头,以.ts结尾) -
apiService.test.ts(中间有任意字符,仍满足首尾约束) -
src/api/v1/auth.ts(路径含api和.ts,且顺序一致)
但不会命中:
-
fetchApi.js(api不在开头) -
api.util.tsx(结尾不是.ts,.tsx不匹配) -
api.*.ts(.是普通字符,*不支持嵌套或转义)
Where 框里填 src/**/*.ts 为什么没用?
Where 框属于 Ctrl+Shift+F(Find in Files)面板,它用的是 Shell glob 语义,但 Sublime 实际只做**前缀匹配**,不真正解析 ** 或递归通配。
所以:
-
src/✅ 正确:匹配所有路径以src/开头的文件(自动包含src/utils/api.ts) -
src/**/*.ts❌ 无效:**被当字面量,搜不到任何东西 -
src/*.ts❌ 只匹配src/下一级的.ts文件,漏掉子目录 -
*.ts✅ 有效:匹配项目内所有.ts文件(等价于留空 + File Types 设为*.ts)
想限定类型又覆盖全路径?老实用 Where 填 src/,再在 File Types 输入框里单独填 *.ts。
想排除 node_modules 但又保留部分路径,怎么写?
Where 框支持排除语法,但层级控制很原始——它只认前缀,不认路径深度。
例如:
-
., -/node_modules/✅ 排除根级node_modules/ -
., -*/node_modules/✅ 排除所有层级的node_modules/(*表示任意前缀) -
., -/packages/foo/node_modules/✅ 精确排除某一条路径 -
., -/node_modules/❌ 无法保留src/node_modules/,因为/node_modules/前缀也会匹配它
没有“只排除根级、放过子目录”的语法。如果必须保留 src/node_modules/,只能换策略:把项目根设为 src/,再用 Where 填 .,这样 /node_modules/ 就不在搜索范围内了。
为什么 !UserProfile.vue 在 Ctrl+P 里能精确匹配,而 !*.test.ts 不行?
! 前缀只对**完整文件名**生效,不是通配符开关。
!UserProfile.vue 表示“跳过模糊匹配,只返回严格等于这个文件名的结果”,所以快且准;但 !*.test.ts 中的 * 在 ! 模式下不被解释为通配,而是当作普通字符,结果就是搜一个叫 *.test.ts 的文件——显然不存在。
真正想批量找测试文件,还是得靠:
-
test(模糊匹配含 test 的文件) -
spec或test_(利用驼峰或下划线跳过机制) - 配合
Ctrl+Shift+R,它比Ctrl+P更倾向文件名匹配,干扰更少
通配符不是万能胶,Sublime 的路径匹配逻辑始终围绕「人眼可读的路径片段」设计,不是 shell 脚本环境。写太花哨反而失效。











