通过快捷键呼出搜索弹窗,对所有已加载文件的内容进行全文检索,点击结果可直接跳转到对应文件。
| 操作 | 快捷键 / 交互 |
|---|---|
| 打开搜索 | ⌘ + Shift + F(macOS)/ Ctrl + Shift + F(Windows/Linux) |
| 关闭搜索 | Escape 或点击弹窗外区域 |
| 快速打开第一条结果 | Enter |
| 跳转到指定结果 | 点击结果条目 |
- 搜索范围:所有分组下的所有文件内容
- 匹配方式:大小写不敏感的子串匹配
- 结果上限:默认最多 200 条命中
- 结果信息:文件名、所属分组、行号、命中片段(关键词高亮)
sequenceDiagram
participant 用户
participant 应用
participant 搜索弹窗
participant 检索模块
participant 接口层
用户->>应用: ⌘+Shift+F
应用->>搜索弹窗: isOpen=true
搜索弹窗->>接口层: fetchFileContent(并发拉取所有文件)
接口层-->>搜索弹窗: 文件内容(带缓存)
用户->>搜索弹窗: 输入关键词
搜索弹窗->>检索模块: searchInFiles(files, query)
检索模块-->>搜索弹窗: FullTextSearchHit[]
搜索弹窗-->>用户: 展示匹配结果列表
用户->>搜索弹窗: 点击某条结果
搜索弹窗->>应用: onSelect(groupName, fileId)
应用->>应用: 切换分组 + 激活文件
| 文件 | 职责 |
|---|---|
src/App.tsx |
快捷键监听、弹窗状态管理、结果跳转 |
src/components/GlobalSearchModal.tsx |
搜索弹窗 UI、文件内容加载与缓存、结果渲染 |
src/utils/fullTextSearch.ts |
全文检索核心算法(按行匹配、预览截取、高亮位置) |
src/utils/fullTextSearch.test.ts |
检索逻辑单元测试 |
- 键盘导航 — 上下方向键选择结果、Enter 打开选中项,减少鼠标依赖
- 防抖输入 — 文件较多时增加约 150ms 输入防抖,避免每次按键都触发搜索
- 每行多处匹配 — 当前每行只取第一个命中,长行中后续匹配会被遗漏
- 增量缓存 — 当前每次打开弹窗都重新拉取所有文件内容;可改为只拉新增/变更文件(结合 SSE
file-changed事件清除对应缓存) - 工作线程搜索 — 文件数量很大时搜索会阻塞主线程,可移至 Worker 执行
- 正则搜索 — 支持切换为正则表达式匹配模式
- 结果按文件分组折叠 — 同一文件多处命中时折叠展示,界面更紧凑