dsh-composer-enter-newline
Verifieddsh-composer-enter-newline · v0.2.0 · MIT
dsh Web UI plugin: on touch devices (tablet/smartphone, incl. landscape) swaps the newline and send keys — Enter inserts a newline, Shift+Enter sends. PCs keep the default behavior. (タッチ端末で改行と送信のキーを入れ替え: Enter で改行、Shift+Enter で送信。PC は既定のまま)
Install
dsh plugin add dsh-composer-enter-newline Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Creators
Readme
dsh-composer-enter-newline
dsh Web UI のメッセージ入力(composer)で、タッチ端末だけ「改行」と「送信」のキーを入れ替えます。PC では dsh 本来の挙動のまま変わりません。
| 端末 | Enter | Shift + Enter |
|---|---|---|
| PC(主入力がマウス等) | 送信(既定のまま) | 改行(既定のまま) |
| スマートフォン・タブレット(主入力がタッチ) | 改行 | 送信 |
Ctrl / Cmd + Enter の送信(実行中は割り込み送信)はどちらの端末でも変更しません。タッチ端末の判定は画面幅ではなく入力デバイスの性質で行うため、タブレットを横にして広い画面で使っても同じ挙動になります。
dsh 本体(@deepseek-ai/dsh)の書き換えは行いません。Web ページ側に小さな仕組みを足すだけの plugin なので、npm install -g @deepseek-ai/dsh で dsh を更新しても消えません。
dsh-composer-enter-newline (English)
A dsh Web UI plugin that swaps the newline and send keys on touch devices only. On phones and tablets (primary input is touch — including landscape / wide layouts): Enter inserts a newline, Shift + Enter sends. On PCs (primary input is mouse/trackpad) the default dsh behavior is left untouched. Ctrl / Cmd + Enter keeps its upstream role everywhere. It does not modify the dsh package itself — it is a self-contained plugin that injects a small browser hook into the page, so it survives npm install -g @deepseek-ai/dsh updates.
If an upstream update changes the composer internals, the hook detects it and falls back key by key to the default behavior instead of leaving the UI broken.
導入方法
方法 1: dsh plugin で導入する(推奨)
dsh plugin --profile web add dsh-composer-enter-newline
# npm に未公開の間は git URL でも同じ:
# dsh plugin --profile web add github:<owner>/<repo>
dsh plugin は profile に package を追加し、この plugin が持つ設定層(cordis.patch.yml)を自動で読み込みます。追加の設定編集は不要です。plugin の読み込みは dsh の起動時に行われるため、いま動かしている dsh には再起動が必要です(実行中のまま導入しても反映されず、再起動後に反映されます)。
systemctl --user restart dsh-web.service # dsh web を systemd で動かしている場合
# 手動で `dsh web` を動かしている場合は、そのプロセスを止めて起動し直すだけです。
# いま dsh を動かしていない場合は、次に起動したときに自然に反映されるので操作は不要です。
方法 2: 既存の cordis.patch.yml に 1 行足す
package を好きな場所に置き、~/.dsh/cordis.patch.yml(全 profile 共通)または profile ごとの cordis.patch.yml に次を追加します。
- insert:
- id: composer-enter-newline
name: /path/to/dsh-composer-enter-newline/index.js
追加後、patchReload: live の profile なら再起動なしで反映されます。反映されない場合は dsh を再起動してください。
挙動の詳細
- スマートフォン・タブレットでは、Enter 単独が改行になります。upstream の改行処理にそのまま任せるので、改行の入り方は既定と変わりません。
- スマートフォン・タブレットでは、Shift + Enter が送信になります。upstream の「Enter で送信」と同じ経路・同じ判定(送信前の確認など)を通ります。長押しで送信が連発することはありません。
- PC では、Enter・Shift+Enter とも dsh 本来の挙動(Enter=送信 / Shift+Enter=改行)のままで、この plugin は介入しません。
- Ctrl / Cmd + Enter はどちらの端末でも upstream の役割(送信)のままです。実行中は割り込み送信(積まれたキューを全量送り込む)で、これは変更していません。
- @ファイル / コマンドの選択メニューが開いている間(タッチ端末)は、Enter は「項目が選ばれていれば選択、選ばれていなければ改行」になります(Enter が送信することはありません)。Shift+Enter は選ばれていれば選択、なければ送信(旧 Enter の役割)です。
- 日本語入力など IME の変換確定の Enter は、そのまま「確定」だけです(改行にも送信にもなりません)。
端末の判定
主入力がタッチかどうか(pointer: coarse / pointer: fine)で判定し、画面幅は見ません。そのため:
- タブレットの横置き・幅広表示でも、タッチ端末として扱われます(同じ挙動)。
- タッチ画面付きのノート PC は、主入力がマウス・トラックパッドであれば PC 扱いです。
- 判定できない環境では、これまでどおり入れ替え側(タッチ端末と同じ挙動)になります。
タッチ端末での実行中の送信の使い分け
| キー | 実行中の動作(既定設定) |
|---|---|
| Shift + Enter(または送信ボタン) | キューへ追加 |
| Ctrl / Cmd + Enter | 割り込み送信(キューがあれば全量送り込み) |
これは upstream の「Enter の実行中動作」設定(Settings → Enter の queue / steer)に従います。設定を steer にすると、Shift+Enter と Ctrl+Enter の役割は逆になります。
dsh アップデート後
この plugin は dsh 本体を書き換えないため、npm install -g @deepseek-ai/dsh の後も再適用は不要です。ただし upstream が composer の内部を変えた場合に備え、自動退避と確認方法を用意しています。
- キー押下ごとの自動退避: 入れ替えの経路が使えないとわかった瞬間、そのキーだけ既定の動作(Enter=送信 / Shift+Enter=改行)に戻ります(ブラウザの開発者コンソールに 1 行警告)。つまり最悪のケースでも壊れず、普通の UI として動き続けます。
- 更新後の確認: dsh 更新後に、タッチ端末で composer に Enter を押してください。改行になれば有効なままで、送信に戻っていたら upstream 変更で自動退避した状態です(UI は壊れていません)。詳しく知りたい場合は、dsh のインストール先にある各
client.jsに目印(data-lexical-editor/KEY_ENTER_COMMAND/listbox/aria-selected)が残っているかを検索してください。
plugin 自身も起動時に同じ目印の点検と警告(dsh 内部ログ)を行いますが、2026-09 実測では dsh の内部ログは画面にもファイルにも出力されません。検知は上記 2 つ(挙動の変化と目印の確認)に頼ってください。
無効化・アンインストール
- 方法 1 で入れた場合:
dsh plugin --profile web remove dsh-composer-enter-newline(pnpm の remove と同じ)。 - 方法 2 で入れた場合: 追加した
insert行を削除して dsh を再起動(またはpatchReload: liveで即時反映)。
動作確認
タッチ端末(スマートフォン・タブレット):
- composer に文字を入力し、Enter を押す → 改行が入り、送信されない。
- Shift + Enter を押す → 送信される。
- タブレットを横にして(幅広表示でも)同じことを試す → 同じ挙動。
@でメニューを開き、矢印キーで選び Enter(または Shift+Enter)を押す → 項目が選択される。
PC:
- composer に文字を入力し、Enter を押す → 送信される(dsh 本来の挙動)。
- Shift + Enter を押す → 改行が入る(dsh 本来の挙動)。
制限・残っている注意
- 端末判定は主入力の種類に依存します。タブレットにトラックパッド・キーボードを接続した場合など、端末が「主入力はマウス等」と報告すると PC 扱いになります(その場合は dsh 本来の挙動)。
- 入れ替えが入ったことの確認は「upstream の処理がキーを受け取ったこと」で判定しています。upstream が将来「受け取ったのに何もしない」変更をした場合、その 1 回だけ元のキー動作になる可能性があります(その場合も壊れず、以降はキーごとに既定動作へ退避します)。
- composer 以外の入力欄(質問カードの選択など)は変更しません。
- この plugin は dsh の Web UI 前提です。headless / SDK profile では何もしません。
公開(メンテナー向け)
npm publish <この plugin の path> # 例: npm publish ./dsh-composer-enter-newline
公開の直前に check-publish-clean.mjs(ソースに同梱の検査スクリプト。npm の同梱には入りません)が自動で走り、公開物へ内部文脈(内部 repo 名・個人環境の path など)が混入していないかを検査して、混入があれば公開を止めます。
未公開の間は git URL でも導入できます(dsh plugin --profile web add github:<owner>/<repo>)。package 名・version・LICENSE の著作権表示は公開前に確認してください。
仕組み(技術詳細)
- host plugin(
index.js)がwebserver/index-injectでclient.jsを index.html の<script>として注入します。client.jsは描画ごとに読み直すため、編集は dsh 再起動なしで反映されます。 client.jsは端末判定(matchMedia('(pointer: fine)')。PC相当なら何もしない)のうえ、document の capture 段階でキーを受け取り、- Enter 単独 → 改行を入れる(
beforeinputの合成 event が第一手段。iOS 系のブラウザでは upstream が keydown からの改行を無効化しているためで、beforeinput経路は iOS / Android どちらでも成立することを実測済み。だめな場合は Shift+Enter 相当の合成 event も試す) - Shift+Enter → 旧 Enter の役割を流す(送信経路) を行います。送信判定・実行中の queue/steer 判定・menu 判定はすべて upstream のまま使われます。
- Enter 単独 → 改行を入れる(
- 合成 event がどの処理にも受け取られなかった場合(
defaultPreventedが false)は、upstream の仕様が変わったと判断し、そのキーだけ元の動作へ戻して hook を止めます。 - upstream 契約(
data-lexical-editor/KEY_ENTER_COMMAND/listbox/aria-selected)は plugin の起動時に自己点検し、欠けていれば dsh の内部ログへ警告を出します(このログは通常表示されません)。