dsh-vim-nav:为 DeepSeek Harness Web UI 提供 Vim 风格键盘导航

前言

在 DeepSeek Harness(DSH)里长时间用鼠标滚会话、点侧栏、抢输入框焦点,很容易打断编写提示词和阅读回复的节奏。浏览器里虽有 Vimium 一类扩展,但无法完整接管 Harness 的工作区列表、会话搜索、内置 Browser 面板,也难避免宿主在打开新会话时自动把焦点塞进 composer。下面介绍的 dsh-vim-nav 是 Endermy 维护的客户端类 Cordis 插件(当前 GitHub 星标为 0),在 DSH Web UI 内实现 Normal / Insert 两套模式与一套对齐 Vim 习惯的快捷键,并针对 Harness 的 DOM 与快捷键服务做了绑定。

这是什么

一句话:Vim-style keyboard navigation for the DeepSeek Harness Web UI(与仓库简介一致)。

插件在界面侧提供模式徽章、滚动驱动和键盘控制器,依赖 Harness 客户端模块加载 client.js,通过 data-conversation-scroll、data-composer-input 等宿主钩子与会话布局协同。包名为 @local/dsh-vim-nav(package.json 版本 1.4.0,许可证 MIT),安装后在插件列表中显示为 Vim Navigation。DeepSeek Harness 生态奉行「一切皆插件」;社区目录站 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,本文安装与行为均以 GitHub 仓库 README 为准。

核心功能

滚动与会话历史

  • j / k:Normal 模式下按住线性滚动,松键下一帧即停,无排队平滑滚动、加速或松键惯性。
  • kk:在会话顶部连按 k,触发宿主自带的「加载更早历史」,并在下一次滚动键时释放宿主的分页位置锁定。

面板焦点与工作区

  • h / l:在工作区、会话区、内置 Browser 之间左右切换焦点;Browser 激活时徽章显示 NORMAL · Browser。
  • Space / Enter:工作区列表获得焦点时,选择光标所在行;切换会话时保持模式(见下文「模式保持」)。

Composer(Insert)

  • i:进入 Insert 写消息。
  • 快速 jk 或 Escape:退出 Insert。
  • dd:清空草稿。

消息级跳转

  • Ctrl+J / Ctrl+K:在当前会话内跳到下一条 / 上一条顶层 user 或 assistant-step 消息(跳过 tool call、进程行等),带短线性滑动;首尾消息处停止。
  • gg / G:跳到会话顶 / 底。

链接提示(Vimium 风格)

  • f:为可见会话链接打标签,输入标签打开链接;Escape 取消,Backspace 改前缀,无匹配前缀则退出提示模式。

工作区归档

工作区面板聚焦且光标在某会话行上时,c 再 x 调用该行归档(与行 UI 按钮相同);运行中的会话走宿主停止并归档确认;行消失后光标移到相邻行。

内置 Browser 的 Vim 层

桌面端右侧 Sidebar Browser 的 Electron <webview> 会注入页面级 Vim 层:j/k 线性滚动(约视口 35%)、gg/G、f 链接提示等;可编辑字段不拦截。跨域 iframe 仅在同源或可脚本化场景生效。离开 Browser 内容焦点时,Linux/Windows 用 Alt+H、macOS 用 Ctrl+H 聚焦会话面板(仅在 Browser 聚焦时注册,可在 Settings → Shortcuts 中改绑)。

会话搜索与快捷键整理

  • Ctrl+F:打开宿主会话搜索;插件会把宿主原 Ctrl+K 绑定迁移到 Ctrl+F(在 Settings → Shortcuts 可见且可改);若无法应用则回退为点击侧栏搜索按钮。

其它行为

  • 模式保持:打开或切换会话不会把 Normal 误切成 Insert;切换前若在 Insert(例如边写边 Ctrl+J 跳消息),新 composer 仍保持 Insert。
  • Ctrl+W:在应用主体中屏蔽关闭窗口;仅在内置 Browser(webview、iframe、工具栏或地址栏有焦点时)按宿主逻辑关闭当前 Browser 页。
  • 无 Visual 模式;不占用 Win / Super / Meta 组合键,留给系统或合成器。

完整键位表见仓库 README 的 Keymap 一节,此处不重复罗列每一行。

安装与启用

前提:已有可用的 DSH profile,且桌面/Web 运行时支持本地 Cordis bundle。

资料中的步骤是获取源码目录后,在 profile 里把该目录注册为本地 bundle,而非凭名称拼接 dsh plugin add github:...。

  1. 按 README 将仓库克隆到本机(命令见下)。
  2. 在 Harness 插件管理器中使用「install local bundle」/ install_bundle,目标为包目录的绝对路径;profile 会记录为 @local/dsh-vim-nav。
  3. 安装后重建或重载 Web UI 一次;桌面端可重载页面,若快捷键仅在启动时同步则需重启应用。
git clone https://github.com/Endermy/dsh-vim-nav.git

该包为本地 bundle,非 npm 发布产物;无构建步骤,client.js 由 DSH 客户端模块加载器直接加载。

典型用法

下面按常见操作顺序说明,均可对照 README 复现。

  1. 读长会话:保持 Normal,j/k 按住滚动;到顶需要更早记录时 kk;gg/G 快速顶底;Ctrl+J/Ctrl+K 在顶层消息间跳转。
  2. 写回复:i 进入 Insert,写完快速 jk 或 Escape 回 Normal;误输入草稿用 dd 清空。
  3. 换面板:h/l 在工作区、对话、Browser 间移动;Browser 内用页面层滚动与 f 点链,再用 Alt+H(Linux/Windows)或 Ctrl+H(macOS)回到会话。
  4. 找会话:Ctrl+F 打开会话搜索(注意与消息跳转的 Ctrl+K 区分)。
  5. 整理工作区:焦点在工作区列表时用方向逻辑定位行,Space/Enter 打开;归档则 c x。

适用场景与注意

适合谁:日常在 DSH Desktop 或支持本地 bundle 的 Web 运行时里大量使用键盘、习惯 Vim / Vimium 的开发者。

权限与信任:客户端插件在当前 DSH 进程权限下运行,会接管键盘与部分快捷键绑定;安装前应阅读 client.js、index.js 与 MIT 许可证,确认来源为 Endermy/dsh-vim-nav。

兼容性:实现绑定了 Harness 特有 DOM 与 slots / locale / layout / shortcuts 等服务;宿主 UI 变更可能需要插件同步更新。README 注明在 DSH Desktop(Linux)等环境测试,截断部分未在此复述。

开发自检(维护者或自改代码时):

node --check client.js
node --check index.js
python3 -m json.tool package.json >/dev/null

修改 client.js 后需在 profile 中重装/重载 bundle;UI 由 shell.overlay 槽渲染,无独立 dev server。

结尾

dsh-vim-nav 把 Vim 式 Normal/Insert、面板焦点、消息跳转和内置 Browser 页内操作收到同一套习惯里,并处理 composer autofocus 与 Ctrl+W 等宿主冲突点。需要键位细节或 Browser 层说明时,以仓库 README 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye