固定片段 · dsh-pins
中文 | English
把对话里划选的段落固定到右侧栏,像便签一样排成一列;点一下跳回原文,打
@引用进消息。
一个 DeepSeek Harness 的 Web UI 插件。读长回复时最容易丢的东西是"我刚刚读到哪、哪几句是关键"——划选、固定、回头看,就这么一件事。
最近更新:1.0.6(2026-11-10)
这一版是热补丁:适配 DSH 0.2.2 起新增的官方「引用文本」浮条,并修好"新固定后看不到强调"。
向下兼容——还在旧版 DSH(0.2.2 之前)的用户照常可用、可以安心升级;即使你的 DSH 还没有官方那条浮条,这一版也修了 bug,同样值得更新。
| 改动 | 说明 |
|---|---|
| 适配官方浮条 | 官方在上、本插件在下,互不遮挡;选区贴顶/贴底时都会自动让位 |
| 可选浮条模式 | 设置 → 插件 → 固定片段 › 选区浮条,三选一 |
| 修好"新固定看不到强调" | 改为先滚到视口再闪;被搜索/标签筛选挡住时会明确说明 |
老用户(DSH 0.2.2 之前,没有官方浮条)在设置里切换会怎样:
| 你选的模式 | 实际效果 |
|---|---|
| 两个都显示(默认) | 只有本插件浮条,正常 |
| 只用固定片段的浮条 | 与默认相同(没有官方那条可隐藏),不会出错 |
| 只用官方的「引用文本」 | 本插件浮条会消失(旧版没有官方那条)。固定仍可用 Alt+P 与右侧面板;想恢复就切回前两项 |
旧版 DSH 上,设置页会直接把这行差异写在开关下面,不用自己试。 一句话记法:旧版 DSH 用前两项,别选第三项。
安装
需要 Harness 的 Web 界面(dsh web)。一条命令,装完会自动把这个 bundle 选进 profile:
# 从 npm 安装(推荐)
dsh plugin --profile web add dsh-pins
# 从 GitHub 安装(想跟最新提交时用)
dsh plugin --profile web add github:ylw-ux/dsh-pins-fixtool
# 从本地目录安装(开发用,会建立 link 依赖,改完刷新页面即可)
dsh plugin --profile web add D:\path\to\dsh-pins
然后刷新浏览器。若没有生效,重启 dsh。
卸载:
dsh plugin --profile web remove dsh-pins
几点说明:
- 不需要 pnpm 构建授权。 这个包没有任何
prepare/postinstall脚本,也没有构建步骤——纯 JavaScript,装完即可用,不会弹 "allow build scripts"。 - 不会动你的 profile 配置以外的任何东西。 它只往 profile 的
package.json加一条依赖、往dsh.profile.bundles加一个名字,以及自己的一份 patch 行。 - 数据在你自己的浏览器里。 固定片段存在
localStorage,不上传、不同步、没有账号。清除站点数据即全部删除。 - 装好后左栏底部(Settings 旁边)会出现带条数的「固定片段」入口;也可以在右侧栏页签里打开它。
用法
1. 固定一段话
在对话里划选文字,选区上方浮出动作条:
| 按钮 | 做什么 |
|---|---|
| 固定 | 存进右侧栏,原文留下持久底色标记 |
| 标签 | 展开标签输入框,回车给这段打标签 |
| 固定并引用 | 固定这一段,同时把引用放进输入框 |
| 引用 | 只把引用放进输入框(不固定) |
| 复制 | 只复制原文到剪贴板 |
Alt+P:固定 / 取消固定当前选区- 鼠标停在卡片上:原地展开(上限
min(60cqh, 420px)),卡片内可滚动看全文 - 点卡片正文:永远 = 跳回原文,落到选中的那段并居中
- 卡片上的
#/❞/⧉/✕:编辑标签 / 引用到输入框 / 复制原文 / 取消固定
DSH 0.2.2 起官方也有划选浮条「引用文本」。默认两个都显示:官方在上、本插件在下(固定 / 标签 / 引用等动作在下方那条)。 想只留一个,去 设置 → 插件 → 固定片段 › 选区浮条 切换。
2. 标签:打一个字就能从已有标签里选
在卡片的标签框、或浮条的标签框里输入,下方会立刻列出匹配的已有标签:
| 操作 | 效果 |
|---|---|
| 输入文字 | 前缀命中的排在前面,同档按使用次数排序 |
↓ / ↑ |
在列表内移动高亮(不会带动外面的卡片列表) |
Enter |
有高亮且你按过 ↑↓ → 应用它;否则 → 创建你输入的名字 |
| 点击 | 该行标签直接加上 |
| 输入一个新名字 | 列表下方出现「创建 #xxx」,显示归一化后的结果 |
细节:
- 输入法打拼音时列表不闪,上屏瞬间就按中文重新匹配;组合中按回车是上屏,不会误提交
- 已经在这条片段上的标签会标「已有」,点了只提示,不会重复添加
- 标签名最长 24 字,首尾
#与多余空白会被归一化 - 标签是跨对话的同一套词:在任何对话里建的标签,别处都能直接选到
3. 新建标签:先把标签建好,再归类
整理工作时往往先有一批标签名,再拿它们去归类。面板顶部工具行最右边的 + 标签:
| 操作 | 效果 |
|---|---|
| 点「+ 标签」 | 工具行下面出现一行输入框 |
Enter |
创建并保持焦点,可以连着建好几个 |
| 重名 | 提示「已有 #xxx」,不创建、不清空输入框(大小写不同也算重名) |
Esc / 点别处 |
关闭输入行 |
建好的标签没有任何片段,所以在 「全部」视图 › 管理全部标签 里显示为 ×0——它存在,只是还没被用过。
- 点
×0的标签不会筛选,会提示"还没有对应片段"(筛选它必然是空列表) - 给任意片段打上这个标签后,它自动变成
×N,不会再重复出现 - 空标签只在「全部」视图里显示;「本对话」按对话统计,不掺别的对话的词汇
- 标签总数上限 200 条
4. 引用进消息
两种形态,都自带内容、都不是指针:
- 浮条的「引用 / 固定并引用」→ 把带出处的引用块放进输入框
- 输入框打
@→ 菜单第一行就是「固定片段」;进去后再打字就是搜索(正文、标签都比对),选中即插入一个引用芯片
两种形态的原文都真的进消息——模型看得到内容,发送后也永不过期。
5. 设置:选区浮条与存储占用
设置 → 插件 → 固定片段。
选区浮条(三选一)——DSH 0.2.2 起官方也提供「引用文本」,两者会抢同一块位置:
| 选项 | 效果 |
|---|---|
| 两个都显示(默认) | 官方在上、本插件在下,互不遮挡 |
| 只用固定片段的浮条 | 隐藏官方那个按钮;它的引用渲染照常工作 |
| 只用官方的「引用文本」 | 本插件浮条不再出现;固定仍可用 Alt+P 和右侧面板 |
已用存储(只读,除上面的浮条模式外这页没有别的可改项):
| 显示 | 是什么 |
|---|---|
| 本插件 | 片段条数、字符数、占本站存储的约百分比 |
| 本站总计 | 存储键数、字符数、约百分比,带进度条 |
| ≥90% | 出现提醒横幅;满了会直接说明「新的固定不会保存」 |
固定、删片段、改标签后会自动重算。
6. 右侧栏面板
| 操作 | 效果 |
|---|---|
| 顶部 | 两个视图(本对话 / 全部)、四种排序、搜索、多选标签筛选、标签管理、markdown 提纲导出 |
| 两个视图的筛选 | 各留一份:在「全部」里选的标签和搜索词不会跟着你去「本对话」,切回来时它们还在原处。排序是全局偏好,两边共用并会被记住 |
| 左栏底部 | 「固定片段」入口,带条数 |
| 输入框里的引用芯片 | 点它:打开右侧栏,并让那条卡片脉冲高亮 |
它不做什么
- 不解析 markdown、不存 HTML 快照。 固定的是你选中的文本、它所在的轮次与偏移,可读、可迁移。
- 不自动切换你的对话。 在「全部」里点别的对话的卡片只会说明情况,不会把你正在读的会话换掉。
- 不注入上下文。 没有任何"把固定片段偷偷塞进模型上下文"的行为;要么你引用,要么模型显式来读(后者尚未实现)。
- 不写任何隐性状态。 固定是显式动作,删除是显式动作。
已知限制
- 只支持 Web(
platform: web)。 TUI / Desktop 没有这一层界面。 - 锚点依赖宿主的 DOM 契约(
data-chat-flow-key、data-chat-turn、[data-conversation-scroll])。宿主若整批改名,持久标记与精确跳转会一起失效——数据本身不会丢(存的仍是文本、轮次、偏移),并且跳转有按位置的降级回退。这是这个插件唯一无法自证的风险,如实写在这里。 - 超过 2000 字的选区只保留前 2000 字:浮条与固定成功的提示会当场说明,卡片上也会标「已截断」,悬停有说明。引用与芯片吃同一个上限。1.0.4 之前保存的片段只有前 600 字,那部分无法恢复。
- 同一段文字在一条消息里出现多次时,定位会挑离记录偏移最近且文本校验通过的那个;都不通过就退回整条消息并标「原文未找到」。
- 「全部」视图的排序/筛选面对的是所有对话,条目多时先折叠分组或加标签筛选,比滚到底更快。
兼容性
在本机验证过的组合:DSH 0.2.1-rc.5 · Node 24.14.1 · pnpm 12.6.0(1.0.3 及更早版本验证于 0.2.0-rc.2)。
DSH 0.2.2 起官方新增了划选浮条「引用文本」。本插件已适配:默认让出上方、自己放到选区下方;也可以在设置里二选一。识别宿主浮层用的是它公开的 data-text-interaction-surface 属性,不是内部类名——宿主若改了这块,本插件会当作没有官方浮层,退回旧位置,不会报错。
向下兼容:0.2.2 之前的老版本一样能用,功能不打折。认不到官方浮层时,浮条按原有方式放置;设置项「只用官方」在老版本上等于关掉浮条(见上方「最近更新」表)。
包内没有声明 peerDependencies,也没有声明 engines.dsh——这是有意的:它不 import 任何 Harness 包(客户端半边只 require('react'),宿主半边是一个空的 apply),所有宿主交互都做了存在性检查并在缺失时降级或明确报错。声明一个我没法验证的版本范围,只会让安装被挡住。
升级到新版本不会动你已有的片段;单独新建、还没被使用的标签也一起保留。
开发
dsh-pins/
├── package.json bundle 清单:dsh.bundle.patch + dsh.client
├── cordis.patch.yml 往 profile 里插一行
├── index.js 宿主半边(预留的 pinsHost 服务,目前为空)
├── client.js 浏览器半边:整个插件都在这一个文件里
├── locale/{zh,en}.json 显示名与描述(插件市场读的就是这个 meta.title)
├── icon.svg 图标(≤ 256 KiB)
└── docs/ 安装与排错
本地开发用 dsh plugin --profile web add <绝对路径> 装成 link 依赖,改 client.js 后刷新页面即可;plugin_manager 工具与 Web 的 Plugins 页面管理的是同一份 profile 状态。
No comments yet. Be the first to write one.