前言¶
在 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 许可证,确认是否符合你对第三方客户端注入的接受程度。
典型用法¶
- 按上文命令为指定
--profile安装插件。 - 重载 DSH Web 界面。
- 在对话输入框内输入多行内容:用 Enter 换行,用 Shift+Enter 发送。
- 使用斜杠命令或建议菜单时,仍用 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