DSH chat-enter-newline
DSH chat-enter-newline 是展示名;npm 包名(也是 Loader 条目 id 的来源)是
dsh-chat-enter-newline—— npm 要求包名全小写,大写形式只用于给人看的标题、仓库描述与商店条目。
DSH 插件:让输入框的 Enter / Shift+Enter / Ctrl(Cmd)+Enter 各自可选「发送消息」或「换行」,并在 设置 → 通用 增加一行「输入快捷键」。
English | 中文
为什么需要它
DSH 把「发送消息」「换行」登记为固定输入操作(registerFixed()):它们只出现在 设置 → 快捷键 的速查表里,用于展示、占用键位和冲突校验,刻意不带覆盖配置、不能录键。真正的按键判定写死在输入框编辑器的 Enter 命令里。
本插件不动引擎的键位表,也不接管那两行只读项,而是在 document 捕获阶段按偏好改写原事件上的修饰键,让引擎自己读到另一种手势:事件保持可信、不 preventDefault、不阻断传播,「发送」和「换行」的语义仍由引擎决定。
与同类实现的区别
这个需求已有多个社区插件(dsh-composer-keys、dsh-keys-setting、dsh-composer-enter、dsh-ctrl-enter-submit、dsh-enter-swap 等)。本插件的取舍是最小且可通读:
- 无宿主 HTTP 路由。宿主半边只有 25 行:声明一个
volatileConfig 并声明界面自带,不注册路由、服务、监听或定时器。 - 只改写修饰键,不重放事件。不合成
KeyboardEvent、不碰 Lexical 内部、不直接改 DOM;isTrusted与事件传播链完全不变。 - 默认与引擎逐字一致。默认值就是引擎键位表,未改动偏好时干预次数为 0。
- 无构建步骤。浏览器半边是手写的
window.__ModuleLoader__.load({ id, factory })bundle,只require('react')。 - 依赖最少。运行时依赖只有引擎同款
@deepseek-ai/schemastery,用于声明 Config schema。
代价是功能收敛:不提供「打断键」、不提供键位方案预设、不支持把发送键改成任意自定义组合键——那些交给上面那些更完整的实现。
行为
| 手势 | 默认(与引擎一致) | 可改为 |
|---|---|---|
Enter |
发送消息 | 换行 |
Shift+Enter |
换行 | 发送消息 |
Ctrl/Cmd+Enter |
发送消息 | 换行 |
偏好等于引擎默认时不做任何改写,所以装上去不改你的现有习惯。Ctrl+Shift+Enter 归入 Shift 手势(引擎键位表 Shift 优先)。
只在主输入框([data-composer-input="true"])内生效。队列编辑框、提问卡片等其它输入不受影响。输入法组合(isComposing、keyCode 229)与 Alt 组合一律放行;/、@ 菜单展开时 Enter 归菜单。
偏好存在哪
可持久化的插件偏好由 profile 的 Cordis 补丁层承载:
- 命名空间:
chat-enter-newline(等于cordis.patch.yml里的 Loader 条目 id) - 字段:
enter/shiftEnter/ctrlEnter,取值send或newline - 落盘位置:
$DSH_HOME/profiles/<profile>/cordis.patch.yml
持久化不用重启:设置行里的选择立即写进该文件并立即生效。也可以直接手改该文件,插件行写成:
- id: chat-enter-newline
name: dsh-chat-enter-newline
config:
enter: newline # 只写要覆盖的手势;未写的字段走 schema 默认
ctrlEnter: send
两个半边
| 半边 | 文件 | 职责 |
|---|---|---|
| 宿主 | index.js |
只声明 Config(字段标 volatile(),才会进入设置表单投影)并调用 settings.configure({ auto: false }),表明界面自带 |
| 浏览器 | client.js |
绑定 ctx.configForms.get(条目 id)、改写 Enter 手势、把设置行注册进 settings.general.item(order 21) |
浏览器半边只 require('react'),刻意不引用任何引擎客户端包——官方 practices.md 禁止这么做,且它们的导出会随版本变化。
依赖的引擎契约
升级 DSH 后若出现「设置行不见了」或「按键不生效」,跑一次自检(需要本机装有 DSH,默认读 D:\Tools\DeepSeek\resources\app.asar,可用 --archive= 或 $DSH_ASAR 覆盖):
node tools/asar.mjs check
它逐条核对下表并打印关键引擎包版本:
[data-composer-input="true"]、[data-composer-card]、[data-trigger-menu]三个属性仍在(dsh-client-ui-conversation/dsh-client-ui-input-trigger)。- Enter 命令仍按
event.shiftKey分流换行/提交,且Ctrl/Meta走同一条提交路径。 settings.general.item槽位与ctx.configForms.get(entryId)/whileServed()仍在(dsh-client-ui-settings)。hooks隔舱仍转成use<Name>选择器钩子(dsh-client-ui-renderer)。- 宿主侧
@deepseek-ai/schemastery仍支持z.union([...]).default(...).volatile()。
开发与验证
node --check index.js && node --check client.js
node test.mjs # 逻辑单测(27 项)
node tools/asar.mjs check # 引擎契约自检
test.mjs 用假的 window.__ModuleLoader__ 接住工厂,覆盖手势识别、改写决策、输入法/Alt/已消费事件放行,以及修饰键写回。
tools/asar.mjs 只读检查打包后的 app.asar(DSH 的实现代码全在里面,PowerShell 与 ripgrep 都读不进去):check 逐条核对上面那些契约,另有 list / grep / extract / versions。
安装与卸载
# 从 Git 仓库或本地目录安装(profile 要与实际运行的一致)
dsh plugin --profile <profile> add github:tianshao88/dsh-chat-enter-newline
dsh plugin --profile <profile> add file:<本目录绝对路径>
# 卸载
dsh plugin --profile <profile> remove dsh-chat-enter-newline
桌面应用启动的 profile 名是 desktop;用 dsh web 启动时是 web。安装后无需重启引擎,刷新页面即可看到设置行;若没出现,再重启引擎。改完本目录的源码要重跑一次安装——file: 是复制而不是软链。
测试过的组合
| DSH | 平台 | 状态 |
|---|---|---|
0.2.0-rc.2 |
Windows 桌面端(Web GUI) | 已实测:设置行写入、Enter 换行、Ctrl+Enter 发送 |
0.2.1-rc.2 |
Windows 桌面端(Web GUI) | 契约自检 8/8 通过、安装与设置行注册正常;按键行为待真人复验 |
其它版本未验证。package.json 用 peerDependencies 声明 @deepseek-ai/dsh: ^0.2.0-rc.2(该范围覆盖 0.2.x 的 rc,0.2.1-rc.2 已通过安装校验):这是引擎真正会拦的兼容性声明(evaluatePluginCompatibility 只检查 peerDependencies 里的 @deepseek-ai/dsh*);另外还有一份 dsh.compatibility.dshReleases,那是社区商店的上架元数据,引擎不校验。
已知限制
- 设置 → 快捷键 的速查表仍显示
Enter/Shift+Enter且只读:那是引擎的固定输入操作目录,插件无法改写,因此两处显示会不一致。 - 偏好按设备与平台独立,和引擎自己的键位覆盖一样不跨设备同步。
- 本插件不改变「忙碌时 Enter 是排队还是插话」的行为,那是 设置 → 通用 里引擎自己的
composer-enter行。 - 依赖引擎的几个 DOM 语义属性与槽位名(见上文契约)。引擎大版本改动时失效模式是「静默不生效」,不会破坏原生功能。
发布状态
已完成:
- GitHub 公开仓库已创建并添加
dsh-plugintopic:https://github.com/tianshao88/dsh-chat-enter-newline。 repository/bugs/homepage均指向该仓库。LICENSE署名为Eric,与 GitHub 显示名一致。
待办:
- npm 发布:需要 npm 账号;推荐用 GitHub Actions + npm OIDC 可信发布(带 provenance 签名),与同类插件的做法一致。
- 版本策略:DSH 仍在 rc 阶段,本插件按
0.x递增;peerDependencies与dsh.compatibility随已验证的 DSH 版本更新。
许可
MIT,见 LICENSE。
No comments yet. Be the first to write one.