前言¶
DeepSeek Harness(DSH)默认的聊天行为是「贴底跟随」:只要没有主动往上滚动,新内容出现时视口会自动拉到底部。这导致在长回答生成过程中,屏幕会不断向下滚动,用户被迫一路追着内容滚,或者等它写完再手动滚回开头。
dsh-chat-answer-anchor 专门解决这个问题。它让视口在你最后停留的位置「冻结」,新回答出现时不再拖拽视口,只有你自己发消息时才会先帮你滚到底部。这个插件不修改 DSH 的核心组件,只通过旁路观察渲染后的 DOM 来控制滚动位置。
这是什么¶
dsh-chat-answer-anchor 是一个纯客户端插件,用于冻结 DSH 聊天区的滚动位置。它由 arcnapan 维护,开源 MIT 许可。安装后,新回答出现时视口不会自动贴底,而是停在用户最后停留的地方;只有用户主动发送消息时,插件才会把视口滚到底,让用户看到自己刚发的消息。
核心功能¶
-
冻结滚动位置:新回答出现时,视口不会自动贴底,而是停留在用户最后停留的位置。滚轮、触摸、点击、翻页键、空格等操作都算用户主动滚动,插件不会抢夺控制权。
-
发消息后先跟到底:用户自己发送的消息需要能看见。插件会在用户发送消息后主动把视口滚到底,让用户看到自己刚发的内容。
-
识别用户意图:插件会区分「用户主动滚动」和「被插件或 DSH 拖拽」两种情况。在用户手势之后的一段时间内,即使有新内容出现,也会认为这是用户的滚动意图,不会把视口拉回原处。
-
拦截自动贴底:在没有用户手势的情况下,如果视口被 DSH 或其他因素往下拽,插件会立即把它拉回原处,并关闭 DSH 的「跟随底部」模式。拉回动作有 120ms 的限速,避免与 DSH 每帧抢夺 scrollTop 导致页面卡顿。
-
会话位置记忆:每个会话会记录自己的滚动位置。切换到其他会话再切回来时,会回到上次停的地方。如果切换时内容还没渲染完,插件会等待内容长够再对齐位置。
-
页面刷新后位置保留:滚动位置按会话存入 sessionStorage,页面重载后可以恢复到之前的位置。
-
可随时关闭:插件提供开关,位于「设置 → 通用 → 新回答不抢视口」。关闭后插件完全停止接管,刷新页面后也会记住这个选择。
-
内容变短不硬撑:如果内容缩短导致滚动位置被浏览器夹回,插件会接受新位置,不会反复往上顶。
安装与启用¶
dsh plugin --profile web add github:arcnapan/dsh-chat-answer-anchor
安装后需要完全退出并重新打开 DSH(Desktop 版关窗口可能只是隐藏,进程还在跑)。安装完成后,在「设置 → 通用」里找到「新回答不抢视口」开关并启用即可。
典型用法¶
启用插件后,正常使用 DSH 聊天即可。当你阅读长回答时,视口会停留在你最后滚动到的位置,不会因为新内容出现而自动往下跑。只有当你自己发送消息时,视口才会先滚到底让你看到刚发的消息。
插件通过观察以下 DOM 元素来工作:
- 滚动容器:[data-conversation-scroll]
- 会话 id:滚动容器祖先上的 [data-conversation-session]
- 轮次行:[data-chat-turn="<数字>"]
- 跟随状态:[data-chat-following-tail]
这些选择器集中在 lib/client.js 顶部的 SELECTORS 里。如果 DOM 结构发生变化导致某个选择器找不到,控制台会打印一条警告,但不会静默失效。
诊断面板¶
插件在 lib/client.js 顶部提供了 SHOW_PROBE 开关(当前为 false)。改成 true 后,会在右下角显示四行状态:
冻结 v15 · 容器 1 · 行 16 · 会话 3f2a9c1d
rest 1200 cur 1200 max 3400
tail 0 跟 0 拦 3 催 1
user 9
拦下贴底
各字段含义:
- 会话:当前滚动容器所属的会话 id 前 8 位
- rest:记住的位置
- cur:当前位置
- max:最大可滚值
- tail:是否还处在「跟随底部」状态
- 跟:是否处在「发送后跟随」的放手期
- 拦:拉回次数
- 催:补发 scrollend 的次数
- user:当前识别到的用户消息行数
- 最后一行是最近一次动作原因
排查问题时改回 true,改完重新加载页面即可。
适用场景与注意¶
这个插件适合需要一边阅读长回答、一边在文档或笔记中做标记的用户。如果你习惯在长回答生成时停下来处理其他事情,然后再回来继续阅读,这个插件能避免每次回来都要手动把视口滚回之前的位置。
插件以当前 DSH 进程的权限运行,安装前建议查看源码确认没有额外权限请求。MIT 许可证允许自由使用和修改。
短结尾¶
dsh-chat-answer-anchor 通过旁路观察 DOM 来控制滚动位置,在不修改 DSH 核心组件的前提下解决了「长回答生成时视口不断下滚」的问题。它尊重用户的滚动意图,支持会话位置记忆和开关控制,适合需要频繁阅读长内容的用户。更多信息请查看插件目录页和 GitHub 仓库。