READMESource: main@5bbcfe4c
dsh-selection-followup · 选中追问
在 DeepSeek Harness 的对话里选中一段文字,旁边会浮出一个小「追问」按钮。 点一下,选中的内容就变成 Markdown 引用块落进输入框,接着问就行。
它解决什么问题
看长回答时想追问某一段,通常得先复制,再切到输入框粘贴,再手动加 > 变成引用,
或者干脆把原文再打一遍。这个插件把这三步合成一步:选好、点一下,引用就位。
行为
- 只在非空选区出现。输入框内部、以及按钮自己的选区都会跳过,所以在输入框里打字 不会误触发。
- 按钮跟着指针走:鼠标松开处右下方弹出;键盘选区(
Shift+方向键之类)则落在选区 上方。靠近窗口边缘会翻到另一侧,贴边收拢用的是按钮实测尺寸,中文「追问」和英文 「Quoted」宽度不同也不会被切掉。 - 引用成功后按钮原地变成一句「已引用」回执,停留 0.9 秒。这个回执不接收鼠标事件, 不会挡住你下一次点击。
- 选区滚出可视范围就不再出现按钮——不会把按钮钉在屏幕边缘,让你去引用一段自己 已经看不见的字。
Ctrl+Shift+Q不用鼠标也能引用当前选区。所有平台都只认 Ctrl:Cmd+Shift+Q在 macOS 上是「注销」。Esc收起按钮。- 引用文本以一次可撤销的纯文本编辑插到光标处(
InputActions.captureInsertion()+insertText());草稿版本在中间变过会重取一次再插。输入框正在提交、拒绝编辑时, 改为追加到草稿末尾。 - 插入进行中再点一次或再按快捷键,会被直接拒掉,不会插出两条重复引用。
- 引用前先规整选区:统一换行、去掉行尾空格、合并多余空行。
- 选中的每一行前面加
>,末尾补一个空行——这样紧跟着写的问题不会被 Markdown 的 懒续行吞进引用块里。 - 在别的会话(侧边对话)里选的文字,不会被引到这个会话的输入框。
- 超过 8000 字符会被截断并加省略号,悬停提示会说明,而不是悄悄截断。
- 点击前不让焦点跑掉(
mousedown被 preventDefault),选区不会提前消失。
和相近插件的区别
目前有几个 Harness 插件都能把选区引用进输入框。这个插件刻意走纯文本路线:
| 本插件 | chip 类插件 | |
|---|---|---|
| 草稿里落的是什么 | 普通 Markdown > … 文本 |
非文本的 chip 节点 |
| 之后能不能改 | 能,跟自己打的字一样 | 只能通过 chip 自己的界面 |
| 需要在宿主注册序列化器 | 不需要 | 需要,缺 codec 会让发送直接失败 |
| 草稿被整体重写后还在不在 | 在 | 取决于 chip 的草稿编码 |
代价是没有迷你引用条、悬停预览、点「引用这条回复」这类富交互。换来的是:草稿永远 是你能直接看、直接改、直接删的普通文本,也不给发送链路增加新的失败点。
测试
纯函数有离线测试,不用开浏览器:
npm test # node --test test/helpers.test.mjs
npm run check # 两半都做语法检查
覆盖引用格式、空白规整、按钮贴边收拢、离屏判定、会话隔离、插入重试与失败回退。 界面效果本身仍需人工看一遍。
安装
在要启用它的 Harness profile 里:
dsh plugin --profile <profile> add dsh-selection-followup
也可以把本仓库目录直接作为 bundle 装进插件管理器。浏览器半边立即生效,刷新页面即可, 不用重启。
兼容性
dsh.client.platform 是 web,浏览器半边用到 conversation.input.overlay 槽位和
InputActions。凡是提供这两样的 Harness 版本都能跑;engines.dsh 声明的是实测下限。
文件分工
| 文件 | 作用 |
|---|---|
lib/index.js |
宿主半边——空实现,只为让 bundle 有个可加载入口 |
lib/client.js |
浏览器半边——选区监听、浮动按钮、写入输入框 |
test/helpers.test.mjs |
纯函数的离线测试 |
cordis.patch.yml |
把插件行插进插件树的 bundle patch |
icon.svg |
插件图标 |
assets/icon-180.png |
商店展示图 |
许可
MIT。
No comments yet. Be the first to write one.