云账号多起来、目录深下去之后,「切到某个账号的某个前缀」这种高频操作,靠鼠标点侧栏 + 逐层进目录就很累。Nebula 的解法是一个 Cmd/Ctrl+K 命令面板:随处唤起,输入即过滤跳转,回车直达。

一开始它只做跳转(账号 / 收藏 / 最近访问)。后来我们把它扩成**「跳转 + 执行命令」二合一**——同一个面板里也能直接跑「刷新 / 上一层 / 上传 / 新建文件夹 / 新建 Bucket / 切换视图 / 切换主题 / 设置 / 检查更新」。

关键设计:每一行自带一个动作

如果给跳转项和命令项写两套选中逻辑,键盘导航、回车执行、去重就得各写一遍,很快会乱。我们让面板里的每一行都携带一个 run(),不管它是跳转还是命令:

interface PaletteItem {
  key: string;
  kind: "recent" | "account" | "bookmark" | "command";
  label: string;
  hint: string;   // 副标题:账号项是厂商,命令项是「命令」
  run: () => void; // 选中就执行
}

跳转项的 run() => onJump(account, path),命令项的 run 就是命令自己的处理函数。于是回车 = 调当前行的 run(),一条路径通吃,上下键选择、鼠标悬停高亮、按 账号|路径 去重全都只写一次。

命令按上下文启用

命令不是永远全亮。它们由当前状态决定:

  • 在桶里(path 非空)才有「上传 / 上传文件夹 / 新建文件夹 / 上一层」;
  • 在根层级(桶列表)才有「新建 Bucket」;
  • 选中了账号才有「刷新」;
  • 「切换视图 / 切换主题 / 设置 / 添加账号 / 关于 / 检查更新」常驻。

这些命令复用工具栏和菜单已有的处理函数——面板不重新实现任何逻辑,只是把它们收集成一个 PaletteCommand[] 数组喂给面板。加一个新命令就是往数组里 push 一项。

空输入时先列最近访问

面板不输入时,顶部先列最近访问的位置(自动记录、保留最近若干条),让「回到上一处工作的地方」变成一次按键。开始输入后,再在 最近 + 命令 + 账号 + 收藏 里一起模糊过滤。

这套下来,键盘党几乎可以不碰鼠标:Cmd/Ctrl+K → 敲几个字 → 回车,跳转或执行一步到位。