dsh-multiline-input

uitested: passnpmMIT

Single/multi-line composer toggle for the DSH Web GUI: an editable shortcut (registered through the harness shortcut service) — Cmd/Ctrl+E on desktop builds and Cmd/Ctrl+Shift+E in the browser, with Linux browsers unbound until you pick one — switches the composer between its native single-line shap

下载量 / Downloads
863
依赖体积 / node_modules
0.74 MB
测试时间 / Tested
2026-11-07
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-multiline-input

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-multiline-input

官网 / Website: <https://dsh.zlmix.com/multiline-input/>

npm · GitHub · Release v0.2.1 · 市场 PR #9938

把 DeepSeek Harness 的对话输入框在单行 / 多行之间切换的 Web 客户端插件。

  • 默认快捷键 Cmd+E(macOS)/ Ctrl+E(Windows / Linux);输入框上沿有一个与输入框同底色的小 tab 显示当前快捷键与目标模式,点击即可切换。
  • 多行模式输入框默认 4 行高(3–5 行区间内),内容变多自动长高,到原生 336px 上限后滚动。
  • 多行模式 Enter 换行、Shift+Enter 发送;单行模式保持 DSH 原生行为(Enter 发送、Shift+Enter 换行)。
  • 输入框上沿的 tab 可收起成一条 8px 细线(3px 粗、带淡色 chevron,热区约 116×20px),把高度让给正文;点击细线随时恢复,收起状态按设备记住。
  • 提交过的文字会记入设备侧输入历史:单行模式 ↑ / ↓、多行模式 Shift+↑ / Shift+↓ 回看并替换,Esc 还原浏览前草稿;失败/被拒的提交也会保留,方便直接重发。
  • 快捷键可在 设置 → 通用 → 快捷键里改成任意组合(冲突校验、恢复默认都由 DSH 官方界面负责)。
  • 模式按设备记住,刷新 / 重启后保持。

安装

# 市场 / CLI 管理的 profile
dsh plugin --profile <profile> add dsh-multiline-input

# 或在应用内「插件」页搜索 / 用绝对路径安装后启用

桌面版使用的 desktop profile 由应用独占(dsh plugin --profile desktop 会被拒绝),请在应用「插件」页安装或手动 link:

cd ~/.dsh/profiles/desktop
pnpm add link:/absolute/path/to/dsh-multiline-input
# 再把 "dsh-multiline-input" 追加到 package.json 的 dsh.profile.bundles

启用后刷新页面即可;插件清单变化不需要重启应用。

卸载:插件页关闭 / 卸载,或 dsh plugin --profile <profile> remove dsh-multiline-input。

使用

操作 · 单行模式 · 多行模式

Enter · 发送 · 换行

Shift+Enter · 换行 · 发送

Cmd/Ctrl+Enter · 加速提交(不变) · 加速提交(不变)

↑ / ↓ · 浏览输入历史 · 原生移动光标

Shift+↑ / Shift+↓ · 原生扩展选择 · 浏览输入历史

Esc(浏览中) · 还原浏览前草稿 · 还原浏览前草稿

/、@ 菜单打开时的 Enter · 选中菜单项 · 选中菜单项

输入法候选态的 Enter · 交给输入法 · 交给输入法

  • 按 Cmd+E / Ctrl+E(或点击 tab)在两种模式间循环;切换不清空草稿、不抢焦点。
  • tab 默认常驻,输入文字时也不隐藏;多行时显示 Shift+Enter 提交 · Cmd+E 单行输入,单行时显示 Cmd+E 多行输入;浏览历史时标签位改为 历史 n/m。
  • tab 是输入框上方独立的一行:展开态 24px;点击右侧收起按钮变成 8px 细线(仍在流内,输入区回收约 16px);细线 3px 粗、右侧带淡色向上 chevron,点击热区约 116×20px,hover 出现浅色胶囊底并把线加亮加长,点击即可恢复。无论展开还是收起,目标条、待办、队列、额度横条等 DSH 卡片都排在它上面,不会被遮住。
  • 收起/展开状态按设备持久化(dsh-multiline-input.hint.v1);收起后 Cmd/Ctrl+E 仍照常切换。

插件配置页

打开 设置(Cmd+,)→ 左侧导航「多行输入」(主入口),或在「插件」页 → dsh-multiline-input → 「多行输入 >」行进入(次入口),可以看到:

  • 快捷键:当前生效键位、「打开设置」按钮(尽力打开系统设置面板)与「设置 → 通用 → 快捷键 → 切换多行输入」路径;
  • 输入历史:已记录条数、二次确认的「清空输入历史」;
  • 提示 tab:一键收起 / 展开提示。

输入历史

  • 提交时就入历史(排队 / steer 也一样,发完马上能 ↑ 到);/ 命令、空提交、超过 16000 字符的单条不记;发送失败 / 被拒的消息也保留,方便直接重发。
  • 设备侧 localStorage(dsh-multiline-input.history.v1)全局一份,按最近提交排序,完全相同的文字只保留一条(重复提交当前最新一条时不重复写入,旧条目再次提交则移到最前);上限 200 条 / 10 万字符。
  • 浏览时首次 ↑ 会把当前草稿存起来:Esc 或在新条目上再按 ↓ 会还原并退出浏览;直接打字 / 粘贴 / 剪切则退出浏览、保留当前文字;提交后从头开始。
  • 清空入口:在「设置 → 通用 → 快捷键」搜索「清空输入历史」,给 multiline-input.clear-history 绑一个组合即可(默认不占用任何键)。
  • 历史是设备本地明文,可能包含敏感内容;换设备不会同步,多窗口之间也不实时同步。

修改快捷键

1. 打开 设置 → 通用 → 快捷键;

2. 搜索「多行输入」(命令名:切换多行输入,id multiline-input.toggle);

3. 点击右侧键位进入录制,按下新组合即可;冲突时官方界面会提示,可随时恢复默认。

tab 实时跟随当前生效的组合;把绑定清空后只显示「多行输入 / 单行输入」,点击仍可切换。

同一个快捷键列表里还有一条默认不绑定的命令 清空输入历史(multiline-input.clear-history),需要时自行指定组合即可。

与相近插件的区别

插件 · 它做什么 · 本插件

dsh-composer-expand · 工具行按钮把输入框撑到 70vh · 双模式 + 快捷键 + Enter/Shift+Enter 互换 + 可收起 tab + 输入历史

dsh-fullscreen-input · 另开全屏面板写多行,Enter 换行、Ctrl+Enter 发送 · 内联在原生输入框,多行时 Shift+Enter 发送(带输入法保护)

dsh-ctrl-enter-submit · 全局把 Enter 改成换行、Ctrl/Cmd+Enter 发送 · 单行保持原生 Enter 发送,多行才交换

dsh-composer-ux · 可配置发送/换行键位 + 右键菜单 + 快捷指令面板 · 只专注输入模式与高度

dsh-keyboard-manager · Ctrl+Q / Ctrl+E / Ctrl+S 切栏、开设置 · Windows/Linux 上它的 Ctrl+E 与本插件默认冲突;可在设置里改键(macOS 本插件用 Cmd+E,不冲突)

实现说明

插件遵守 DSH 的第三方客户端插件契约(dsh.client + dsh.bundle.patch),Host 半只保留一个可安装 / 启停的 bundle row,功能全部在 client.js:

  • 模式状态:模块级 store + localStorage['dsh-multiline-input.mode.v1'],投影为 <html data-dsh-multiline-input="multi">;
  • 高度:一条 CSS 规则给 [data-composer-card] [data-composer-input] 设 min-height: calc(4 * 1lh + 8px)(@supports 回退到 104px),不碰 DSH 的滚动上限;选择器同时匹配 contenteditable="true" 与只读提交相位(data-phase 不是 plain 时,如 0.2.2 的 sending)——0.2.2 起普通消息在等待 Host 接受期间编辑器是 contenteditable="false",只匹配前者会让高度在每次发送时塌回宿主的 36px 再弹回;
  • tab 提示:注册到 conversation.input.dock 座位(order: 1000,排在 todo 0 / 额度横条 5 / 目标条 10 / 队列 20 之后),成为输入卡片正上方独立的一行:展开 24px、收起 8px,宽度与卡片同列、tab 右对齐到卡片右边缘;margin-bottom 吃掉栈的行距(dock 态 6px、hero 态 8px,运行时按实际 row-gap 同步),让 tab 底边与卡片上沿齐平、视觉上仍是「卡片肩上的 tab」,但因为占位而不可能压到任何上方卡片;收起态靠同一行 8px 高度 + 抵消行距把输入区回收约 16px。
  • 旧实现走 conversation.input.overlay 浮层(bottom: 100% + z-index: 2),会盖住目标条右侧的文案与暂停 / 编辑 / 清除按钮;
  • 输入历史:轮询 useInput(s => s.phase/draft) 与 useSession(s => s.pendingSubmissions)。0.2.2-rc.1 起普通消息走 sending 冻结相位(草稿冻结、编辑器只读、Host 接受后 pendingSubmissions 增长才清空),所以提交时先捕获冻结草稿、待回显出现时写入 localStorage;0.2.1-rc.5 / rc.3 没有 sending,回显是乐观的(提交时出现、失败时移除并回填草稿),走「捕获草稿 → 回显退休且草稿未回填才写入」的兜底路径。两条路径由「是否见过 sending」在运行时选定,失败 / 被拒的提交都不入历史。浏览时通过公开的 inputActions.setDraft() 替换草稿(setDraft 会合并进撤销历史),方向键手势仍在 document 捕获阶段接管。带引用(quote)发送时,引用会以 Markdown 块引用文本进入草稿字符串,因此同样被记入历史;召回时 setDraft 只写纯文本,引用 chip 不会复原。
  • Enter / Shift+Enter:在 document 捕获阶段拦下多行模式下的 Enter,向编辑器重放一个翻转了 shiftKey 的合成按键——仍由 DSH 自己的 composer keymap 决定「换行」还是「提交」,撤销历史、输入法保护、busy-enter(queue/steer)、菜单仲裁全部保持原逻辑;
  • 快捷键:通过 ctx.shortcuts.register() 注册命令,编辑与持久化完全交给 DSH。

源码依据(DSH 0.2.2-rc.1,commit 66491b05;0.2.1-rc.5 契约同读于 b830ec95):

契约 · 源码文件

输入卡片 / 覆盖层锚点 · packages/client/ui-conversation/src/client/skeleton/InputBar.tsx、InputBar.module.css

composer 卡片栈(conversation.input.dock) · packages/client/ui-conversation/src/client/skeleton/ConversationContent.tsx、`ConversationRoot.module.css

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::5,最后更新 2026-11-05

Links

GitHub · Homepage · npm

Same category