Configures from the settings window's General page whether Enter, Shift+Enter and Ctrl/Cmd+Enter send the message or insert a line break; the engine default is kept until you change it.
Install
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/itchenshi/dsh-keys-setting/releases/download/v0.2.0/dsh-keys-setting-0.2.0.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:itchenshi/dsh-keys-setting
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Decide in DSH Settings → General whether Enter / Shift+Enter / Ctrl+Enter (⌘ on macOS) sends the message or inserts a line break.
What it does
- Adds a "Key bindings" row to Settings → General, with one picker per gesture (Send / Line break).
- Listens for
keydownon the composer in the capture phase: it intercepts only when your choice differs from the engine's native behaviour, then re-dispatches the engine's other gesture. - Remaps the gesture only — it never touches the content; what "send" and "newline" mean stays the engine's decision.
- Always passes IME events (
isComposing/ keyCode 229) andAlt+Enterthrough. - Defaults equal the engine's native behaviour, so with untouched settings it intervenes zero times.
Install
Using DSH Ready GUI (recommended): the plugin ships inside the GUI. Open the GUI → Settings → "Third-party plugins" and tick Key bindings, then refresh the page as prompted (it has a page half).
Any other DSH host (
dsh web, the CLI) — either route works:# Recommended: install straight from GitHub dsh plugin --profile web add github:itchenshi/dsh-keys-setting # Fallback: install this release's tarball dsh plugin --profile web add https://github.com/itchenshi/dsh-keys-setting/releases/download/v0.2.6/dsh-keys-setting-0.2.6.tgzBoth land the full repository contents (including
cordis.patch.yml); no extra configuration is needed afterwards.
Not on npm yet (
registry.npmjs.orghas no such package), so use one of the two routes above.
Usage
In Settings → General, the new "Key bindings" row is where you set them; changes apply immediately.
You can also hand-edit the row id: composer-keys in the profile's cordis.patch.yml: the host half re-reads when the page window regains focus, so switching back to the Harness window applies it without a page reload.
Configuration
The config of the row id: composer-keys in cordis.patch.yml (all three fields are declared by the plugin's Config schema):
| Key | Default | Meaning |
|---|---|---|
enter |
send |
send = send the message, newline = insert a line break |
shiftEnter |
newline |
Same, for Shift+Enter |
ctrlEnter |
send |
Same, for Ctrl+Enter (⌘ on macOS) |
The row's config block is required: without it the row has no settings entry and the host can neither read nor write the preference. When config.enabled === false the host returns immediately — no route, no settings row.
Compatibility
- Requires DSH >= 0.2.0-rc.2 (engine 0.2.0 replaced the settings service API; on 0.1.x the preference cannot be saved).
- Node >= 20.
- Runtime dependencies: none; the schema library is the engine's own
@deepseek-ai/schemastery.
FAQ
A change had no effect? Changes made in the settings window apply immediately; after a hand edit, switch back to the Harness window to trigger the re-read. At startup the host logs [composer-keys] route ready at /composer-keys (entry composer-keys) — if that line is missing, the plugin did not load.
What if the engine is too old? The manifest declares >=0.2.0-rc.2 only; older engines expose the retired settings service (register / get / section), so the plugin cannot save the preference.
What does it store, and where? Only those three values, in the plugin's own row config (the engine's settings document). The plugin reads and writes no files itself.
Can another local program read or change the preference? The host exposes exactly one route, GET/POST /composer-keys, behind the engine's own trust fence (Host allow-list + browser session cookie) and it fails closed — a bare curl without the cookie gets 401. The plugin makes no outbound network requests.
Development
node --check lib/index.js
node --check client/client.js
npm test # node tests/test.mjs: gesture recognition, intervention, IME pass-through, defaults never intervene
License
MIT
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8597
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8597
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4424
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
ccch1mneyyy/dsh-TUI★ 4268
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 4098
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1445
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.