6e6e6e/dsh-simple-quote ↗★ 0

dsh-simple-quote

Quote selected conversation text into the composer with one click.

包名
dsh-simple-quote
兼容性
待验证
版本
0.0.6
许可证
GPL-3.0
最近更新
2026年10月28日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add https://github.com/6e6e6e/dsh-simple-quote/releases/latest/download/dsh-simple-quote.tgz

dsh-simple-quote

在 DSH 的会话里划一段字,点一下「添加到输入框」,它就以引用块的形式躺进输入框,光标停在分隔线下面。

为什么写这个

我用 DSH 的方式基本是「读一段长回答 → 挑其中一段追问」。以前每次都要手动复制、粘贴,再补上「」和一行横线,一天下来重复几十遍,很蠢。

真正麻烦的是格式。会话里明明是好端端的有序列表、带语言标记的代码块、带地址的链接,选中复制过去就变成一坨纯文本:1. 2. 的编号没了,链接只剩「文档」两个字,代码块连围栏都不剩。粘完还得自己重排一遍,比手打还慢。

也试过几个现成的 quote 插件,都不太行:功能列了一长串,高亮、标签、收藏、侧边栏回顾,真用起来反而比直接把文字贴过去还绕。我想要的只是「把这段拿过来」这一个动作。

所以索性写了个插件:选中,点一下,引用块已经在输入框里了。既然要写,就顺手把「还原 Markdown」做干净——引用的意义是能读,格式丢了不如截图。

只给自己用,所以没有配置项,也没有快捷键面板,行为都按我自己的习惯定死了。

安装

从 Releases 下载安装包,在 DSH 的插件面板里选择安装本地包、指向这个文件。固定地址 dsh-simple-quote.tgz 永远指向最新版;想装指定的版本,就进 Release 页面挑带版本号的那个。懒得自己点的话,把链接丢给 DSH,让它帮你装也行。

怎么用

  1. 在会话正文里用鼠标选中文字,普通消息、代码块、表格、公式都行;

  2. 松开鼠标,指针右侧出现「添加到输入框」(贴近屏幕右边缘时会翻到左边,免得被切掉);

  3. 点它,输入框里多出:

    「选中的那段文字」
    ------
    

    光标停在 ------ 下一行,直接接着写你的问题,回车发出去。

输入框里本来有草稿也不会被冲掉,引用块空一行接在末尾。

功能特点

只在会话正文里生效。 输入框、侧边栏、设置页里划词不会弹菜单,那些地方的选中多半不是你想引用的东西。

引用内容尽量还原成 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。