前言¶
在 DeepSeek Harness(DSH)里浏览插件时,列表和详情往往共用同一个滚动容器。点开某条插件后,列表 DOM 被替换,容器高度缩回一屏,浏览器会把 scrollTop 钳到 0;点「返回插件」时,内核并没有把之前的滚动偏移写回去,于是一次次回到列表顶部。插件一多,想逐个看简介就会不断重复往下滚。下面介绍社区插件 dsh-plugin-scroll-memory(维护者 chenyidong,分类:记忆),专门处理「列表 ↔ 详情」这一跳时的位置恢复。
这是什么¶
dsh-plugin-scroll-memory 是纯客户端 DSH 插件(约 100 行),在 Web / 桌面端的插件管理页生效:列表可见时持续记录容器的 scrollTop,从详情回到列表时把记录值写回,避免每次都从顶部重来。它不注册 slot、不调用 host 服务、不修改内核 app.asar,卸载后不留残留。当前 package 版本为 0.1.0,许可证 MIT,引擎要求 dsh 为 >=0.2.0-rc.1 <0.3.0-0。
问题从哪来¶
插件页把列表和详情渲染在同一个滚动容器里。进入详情时列表被整体替换,容器高度塌回一屏,scrollTop 被浏览器夹到 0;返回列表时没有逻辑恢复偏移,因此默认总是顶部。在插件数量较多、需要连续浏览条目时,这一点尤其碍事。
核心功能与覆盖范围¶
经过上面的步骤理解机制后,可以这样概括插件行为:
- 列表态:容器处于列表时,持续记录
scrollTop。 - 回到列表:详情节点消失(刚返回列表)时,在下一帧写回记录值;若列表高度尚未撑开,再补一帧重试。
- 详情内滚动:在详情里继续往下滚不会覆盖已记忆的列表位置;例如在详情底部再返回,仍会回到进入详情前那一行。
详情态依靠 DSH 内核已有的 DOM 标记识别,三种详情页均有效:
| 标记 | 对应页面 |
|---|---|
[data-plugin-detail] |
组合包详情 |
[data-plugin-item-detail] |
官方插件条目详情 |
[data-market-detail] |
「发现」市场条目详情 |
实现上一律读实时 DOM,而不是缓存 UI 状态。切到详情时浏览器会把 scrollTop 夹到 0 并触发 scroll 事件,但那一刻详情节点已存在,该伪事件不会被误记成「列表在顶部」。
安装与启用¶
插件以当前 dsh 进程的权限运行;安装前建议浏览 GitHub 仓库 源码并确认 MIT 许可证与行为是否符合预期。
先选定要使用的 profile,再执行官方 README 中的安装命令:
dsh plugin --profile <profile> add github:chenyidong/dsh-plugin-scroll-memory
安装完成后重启该 profile,客户端配置为 platform: web、immediately: true,装好后在插件管理页即可生效。
本地开发时可将源码目录 link 到 profile(同样来自 README):
dsh plugin --profile <profile> add link:/path/to/dsh-plugin-scroll-memory
典型用法¶
日常使用不需要额外配置项:在插件列表滚到中间 → 点开任意插件详情 → 点「返回插件」→ 列表应停在原处。
仓库提供基于假 DOM 的测试,可在插件目录下自行验证三种情形:
node test.cjs
或用 npm script:
npm test
覆盖:列表滚动后进详情再返回;详情内滚动不污染列表位置;列表本在顶部时返回仍在顶部。
适用场景与限制¶
适合:经常在 DSH Web 或桌面端插件页连续查看多条插件/市场条目,且主要痛点是「详情返回列表跳顶」的开发者。
不适用或需注意:
- 终端 TUI 插件页不在覆盖范围内。
- 依赖内核的
data-plugin-body、data-plugin-detail等标记;宿主大版本调整 DOM 时,插件可能需要跟随更新。 - 离开插件页再进入不会保留位置(容器会重新挂载);本插件只解决同一插件页内「列表 ↔ 详情」往返。
- 社区目录 skillhub.cn 插件页 为独立生态站点,与 DeepSeek / 幻方无官方从属关系;安装来源以 GitHub README 命令为准。
结尾¶
dsh-plugin-scroll-memory 用最小的客户端逻辑补上插件管理页缺失的滚动恢复,让「逐个看插件」不再伴随重复的滚轮操作。进一步了解可访问目录页 skillhub.cn/plugins/chenyidong/dsh-plugin-scroll-memory 与源码 github.com/chenyidong/dsh-plugin-scroll-memory。