dsh-simple-quote
Quote selected conversation text into the composer with one click.
インストール
npx -p @deepseek-ai/dsh dsh plugin --profile web add https://github.com/6e6e6e/dsh-simple-quote/releases/latest/download/dsh-simple-quote.tgzドキュメント
README 全文を読む ↗dsh-simple-quote
在 DSH 的会话里划一段字,点一下「添加到输入框」,它就以引用块的形式躺进输入框,光标停在分隔线下面。
为什么写这个
我用 DSH 的方式基本是「读一段长回答 → 挑其中一段追问」。以前每次都要手动复制、粘贴,再补上「」和一行横线,一天下来重复几十遍,很蠢。
真正麻烦的是格式。会话里明明是好端端的有序列表、带语言标记的代码块、带地址的链接,选中复制过去就变成一坨纯文本:1. 2. 的编号没了,链接只剩「文档」两个字,代码块连围栏都不剩。粘完还得自己重排一遍,比手打还慢。
也试过几个现成的 quote 插件,都不太行:功能列了一长串,高亮、标签、收藏、侧边栏回顾,真用起来反而比直接把文字贴过去还绕。我想要的只是「把这段拿过来」这一个动作。
所以索性写了个插件:选中,点一下,引用块已经在输入框里了。既然要写,就顺手把「还原 Markdown」做干净——引用的意义是能读,格式丢了不如截图。
只给自己用,所以没有配置项,也没有快捷键面板,行为都按我自己的习惯定死了。
安装
从 Releases 下载安装包,在 DSH 的插件面板里选择安装本地包、指向这个文件。固定地址 dsh-simple-quote.tgz 永远指向最新版;想装指定的版本,就进 Release 页面挑带版本号的那个。懒得自己点的话,把链接丢给 DSH,让它帮你装也行。
怎么用
-
在会话正文里用鼠标选中文字,普通消息、代码块、表格、公式都行;
-
松开鼠标,指针右侧出现「添加到输入框」(贴近屏幕右边缘时会翻到左边,免得被切掉);
-
点它,输入框里多出:
「选中的那段文字」 ------光标停在
------下一行,直接接着写你的问题,回车发出去。
输入框里本来有草稿也不会被冲掉,引用块空一行接在末尾。
功能特点
只在会话正文里生效。 输入框、侧边栏、设置页里划词不会弹菜单,那些地方的选中多半不是你想引用的东西。
引用内容尽量还原成 Markdown,而不是拍平成纯文本。 支持:
- 标题、粗体、斜体、删除线、行内代码
- 链接保留地址:
[文档](https://example.com/doc) - 有序、无序、嵌套列表,以及任务列表的勾选状态
- 代码块,保留语言标记和围栏;缩进在列表里的代码块也不会塌
- 引用块、表格
- KaTeX 公式,从 TeX 还原成
$...$,不会把 MathML 和视觉副本拼成两份
几个坑是特意处理过的:表格有 `` 时始终拿表头当 Markdown 表头,哪怕你只选了正文那几行;行内元素两头的空格会挪到标记外面,**粗体 **普通 不至于粘成 **粗体 普通**;链接文字里带 ] 会转义,不然后面整条 Markdown 链接就断了。
菜单贴着鼠标走,但不压住你正在看的那行。 按实际宽高测量后放在松手点的右下方;右边放不下就翻到左侧,下面放不下就翻到上方,始终夹在视口内。跨好几屏的长选区也不会把菜单甩到天边;没有小箭头,看着干净。滚动页面、按 Esc、点别处、窗口失焦、切换会话,它都自己消失。配色跟随宿主主题,文案跟随 DSH 的界面语言(中文 / English)。
超长选区兜底。 单次最多引用 12000 字符,超出部分以 … 结尾。如果正好截在代码块中间,会按原有的缩进或引用前缀补上收尾围栏,不留下半截反引号;截断也不会把 emoji 的代理对劈开。
代码结构
一共一千来行,大部分代码在处理上面那堆 DOM 到 Markdown 的边角情况。
| 文件 | 做什么 |
|---|---|
index.js | 宿主侧的包入口,apply() 是空的,活都在浏览器侧 |
lib/client.template.js | 插件外壳:读选区、量尺寸定位、渲染浮层、注册插槽、绑事件 |
lib/selection-markdown.js | 把渲染后的 DOM 序列化回 Markdown,最脏的一个文件 |
lib/quote-text.js | 纯函数:拼引用块、追加草稿、算菜单位置、截断。不碰 DOM,能脱离浏览器直接测 |
scripts/build-client.mjs | 把 lib/ 揉成单文件 |
client.js | 构建产物,浏览器真正加载的文件 |
开发
npm install # 只装 jsdom,运行时零依赖
npm run build # 从 lib/ 生成 client.js,打包前也会自动跑
npm test # 纯函数 + jsdom 序列化 + 构建产物冒烟,24 个用例
改代码改 lib/,client.js 是生成物,不要直接编辑。
已知限制
@路径的文件链接在界面里渲染成按钮,DOM 里没有原始地址,引用后只剩显示文字;- 本地图片走
blob:地址,引用时只保留 alt,不写临时地址; - 草稿里已有
@文件chip 时,整体改写草稿会让 chip 退化成纯文本(内容不丢); - 表格没有 `` 又只选了一行时,仍然按「第一行当表头」输出——Markdown 表格必须有表头,没有更好的退路。
License
GPL-3.0,见 LICENSE。