dsh-swap-enter:在 DSH 对话输入框中互换 Enter 与 Shift+Enter

前言

在 DeepSeek Harness(DSH)的 Web 对话界面里,默认习惯往往是:单独按 Enter 发送消息,Shift+Enter 换行。飞书、Slack、Telegram 等不少聊天产品则相反——Enter 换行,Shift+Enter 发送。长期混用两套快捷键的人,在 DSH 里写多行提示词时容易误触发送,或在本该发送时只插入了一行空行。

DSH 的对话输入(composer)并非一个可切换的全局「键位方案」开关:ui-conversation 客户端插件的配置里只有 busyEnter(queue 或 steer),设置界面里展示的 fixed.send / fixed.newline 仅是说明性记录,并不真正路由按键。实际行为分散在 composer 的两条代码路径里。dsh-swap-enter 以客户端插件形式在浏览器侧拦截并改写这两条路,把 Enter 与 Shift+Enter 的行为对调,且尽量不破坏补全菜单、IME、修饰键组合等原有逻辑。

下面介绍插件的定位、安装方式、使用效果与实现要点;事实均来自仓库 README 与 package.json。

这是什么

dsh-swap-enter 由维护者 64511982lin-hash 发布,分类为客户端插件,面向 DSH Web UI 的对话输入框。

启用后:

  • Enter → 插入换行
  • Shift+Enter → 发送消息

与默认 DSH 行为相反,适合习惯「Enter 换行、Shift+Enter 发送」的开发者。宿主侧(host)无逻辑,全部为纯 ES Module 浏览器 bundle,无构建步骤、无运行时依赖。

  • 目录页:https://www.skillhub.cn/plugins/64511982lin-hash/dsh-swap-enter
  • 源码:https://github.com/64511982lin-hash/dsh-swap-enter
  • 许可证:MIT
  • 当前包版本:1.0.0(见 package.json)

核心功能

键位对调

仅在焦点位于带 [data-composer-input] 的对话输入区域内时生效;对调的是裸 Enter 与 Shift+Enter,不改动其他快捷键语义。

明确不介入的场景

对调时必须避免破坏 Enter 的其它用途。README 中列出的行为保持不变:

情况 行为
建议项或斜杠命令菜单已打开 不改动——Enter 仍用于选中高亮项
IME 组字进行中(中文、日文、韩文等) 不改动——组字按键不会进入插件
Ctrl / Cmd / Alt + Enter 不改动——原有组合键仍可用
输入框为只读 不改动
焦点不在 composer 内 不改动
插件卸载(切换 profile、HMR 等) 恢复 DSH 出厂键位

长按 Shift+Enter 发送时,只触发一次发送,不会因按键连发重复提交(auto-repeat 标志会沿提交路径传递)。

平台与版本

  • 声明兼容 DSH:>=0.2.0-rc.1 <0.3.0-0
  • 在 DSH 0.2.2-rc.1(桌面构建)上开发与验证
  • 仅 Web UI(dsh.client.platform: "web")
  • 依赖当前 0.2.x 线 composer 为 Lexical 编辑器,且具备 data-composer-input 与 beforeinput 桥接;未来 composer 重写可能需插件跟进

安装与启用

从插件市场(dsh-market,或基于 awesome-dsh-plugin 索引的任意 storefront)安装:

dsh plugin --profile <profile> add github:64511982lin-hash/dsh-swap-enter

也可通过 plugin_manager 指向本地目录(需自行具备合法路径,本文不展开 clone 步骤):

plugin_manager install_bundle { target: "<absolute path to this directory>" }

安装完成后重新加载 Web UI。README 写明:无需任何配置项。

插件与当前 DSH 进程/浏览器会话中的客户端代码一同加载。安装前建议自行阅读仓库源码与 MIT 许可证,确认是否符合你对第三方客户端注入的接受程度。

典型用法

  1. 按上文命令为指定 --profile 安装插件。
  2. 重载 DSH Web 界面。
  3. 在对话输入框内输入多行内容:用 Enter 换行,用 Shift+Enter 发送。
  4. 使用斜杠命令或建议菜单时,仍用 Enter 确认选项,行为与未安装时一致。

仓库提供本地测试(验证真实 client.js 在 stub DOM 下的八项用例):

node test/swap-enter.test.cjs

预期输出包含:Enter -> line break、Shift+Enter -> send,以及菜单打开、只读、IME、焦点在外、dispose 后恢复等「不改动」用例均为 PASS。

适用场景与注意

适合谁

  • 长期在 DSH Web UI 中编写多行 system prompt、工具说明或长上下文,且 muscle memory 来自「Enter 换行」类产品。
  • 希望在不改 DSH 核心、不fork 客户端的前提下,用社区插件调整键位。

需要注意

  • 仅 Web 客户端;非 Web 平台不受此 bundle 影响。
  • DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系,本文所述安装命令以仓库 README 为准。
  • 星标与热度不代表安全审计;客户端插件在浏览器中拦截键盘事件,权限边界与「当前登录的 DSH Web 会话」一致。
  • 若未来 DSH 升级超出 >=0.2.0-rc.1 <0.3.0-0 或 composer 实现变更,需关注仓库兼容说明后再升级生产环境。

实现概要(供排查问题时参考)

client.js 在 document 上以捕获阶段注册 keydown 监听,先于 Lexical 在编辑器根节点上的监听执行。当来自 [data-composer-input] 内的裸 Enter 到达时,插件 preventDefault() 并 stopImmediatePropagation(),再沿相反路径重放:

  • Shift+Enter(发送):派发 shiftKey: false 的合成 keydown,走 composer 自带的提交逻辑(含 busy/steer 规则)。
  • Enter(换行):派发可取消的 InputEvent('beforeinput', { inputType: 'insertLineBreak' }),由 Lexical 的 beforeinput 处理插入;不能用 shiftKey: true 的合成 keydown 代替,因非信任事件没有默认换行行为。

合成事件用 WeakSet 标记,避免热重载或重复监听时二次拦截。

结尾

dsh-swap-enter 解决的是 DSH 默认「Enter 发送」与常见 IM「Enter 换行」不一致的问题,用最小客户端 bundle 在 Web composer 内对调两条已有代码路径,并保留菜单、IME 与修饰键等边界行为。

  • 插件目录:https://www.skillhub.cn/plugins/64511982lin-hash/dsh-swap-enter
  • GitHub:https://github.com/64511982lin-hash/dsh-swap-enter
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye