前言¶
在 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 許可證,確認是否符合你對第三方客戶端注入的接受程度。
典型用法¶
- 按上文命令爲指定
--profile安裝插件。 - 重載 DSH Web 界面。
- 在對話輸入框內輸入多行內容:用 Enter 換行,用 Shift+Enter 發送。
- 使用斜槓命令或建議菜單時,仍用 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