dsh-swap-enter:在 DSH 對話輸入框中互換 Enter 與 Shift+Enter

前言

在 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 許可證,確認是否符合你對第三方客戶端注入的接受程度。

典型用法

  1. 按上文命令爲指定 --profile 安裝插件。
  2. 重載 DSH Web 界面。
  3. 在對話輸入框內輸入多行內容:用 Enter 換行,用 Shift+Enter 發送。
  4. 使用斜槓命令或建議菜單時,仍用 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜