dsh-middle-click-tab-close:爲 DSH 右側邊欄標籤補上中鍵關閉

前言

在 DeepSeek Harness(DSH)桌面客戶端裏,右側邊欄會打開文件、終端、交付物、Guide 等標籤頁。瀏覽器裏中鍵點標籤即可關閉,是多數開發者已經養成的習慣;DSH 自帶標籤條只支持左鍵選中、右鍵菜單,以及標籤上的 × 關閉。中鍵按下時,dockkit 的 chip 處理邏輯會把它當成左鍵選中,無法直接關掉標籤。若你經常在邊欄裏開很多頁,每次挪到 × 上點一下,會比中鍵慢一截。下面介紹的插件 dsh-middle-click-tab-close 由社區維護者 icrefin 發佈,分類爲客戶端插件,在不動官方 UI 源碼的前提下,讓右側邊欄(含浮動窗標題區)支持與中鍵關閉瀏覽器標籤相同的手勢,並走與 × 相同的 ctx.sidebarRight.close(tabId) 關閉路徑。

這是什麼

dsh-middle-click-tab-close 是一個僅作用於 DSH Web 客戶端前端的 Cordis 插件:在文檔上註冊一個捕獲階段的 pointerdown 監聽,當檢測到鼠標中鍵(button === 1)且按壓發生在 [data-sidebar-right-session] 內時,解析被點的 [data-dockkit-tab],再調用官方側欄控制器關閉對應標籤。Host 側入口存在但無業務邏輯,只爲 Loader 攜帶 browser 半包;無配置項、無設置卡片、無額外路由或樣式。

維護與源碼:

  • 目錄頁:https://www.skillhub.cn/plugins/icrefin/dsh-middle-click-tab-close
  • 倉庫:https://github.com/icrefin/dsh-middle-click-tab-close
  • 許可證:MIT(以倉庫 LICENSE 爲準)

爲什麼是插件而不是設置項

右側標籤條是隨客戶端發佈的 UI。dsh-client-ui-dockkit 繪製每個 chip 爲 role="tab",其 onPointerDown 僅跳過右鍵(button !== 2),中鍵仍會觸發選中。dsh-client-ui-sidebar-right 持有列布局、標籤註冊表以及文檔化的 ctx.sidebarRight.close(tabId)。沒有用戶級開關能單獨打開「中鍵關閉」,也沒有擴展 chip 行爲的插槽。要在不 fork、不 patch 官方 strip 的前提下增加手勢,只能在頁面裏觀察 chip DOM,並調用 UI 已在使用的關閉 API。這是插件形態的原因,而非可選偏好。

核心功能

手勢範圍

左鍵仍選中標籤;右鍵仍打開菜單;中鍵關閉標籤——對停靠在右側邊欄的標籤條上的 chip,以及對浮動窗標題條(data-dockkit-float-title)同樣生效。README 用示意說明:在「Report × | Guide | Terminal ×」這類標籤文字區域中鍵,效果與點該標籤的 × 一致。

關閉路徑與保護規則

處理流程(資料原文步驟摘要):

  1. 確認 button === 1 且事件在 [data-sidebar-right-session] 內。
  2. 從按壓元素向上找最近的 [data-dockkit-tab],得到 layout tab id。
  3. 若 chip 未繪製 [data-dockkit-tab-close],則不處理——例如唯一停靠的 Guide 無關閉控件,插件拒絕中鍵,避免無效攔截。
  4. 調用 ctx.sidebarRight.close(tabId):資源清理、registerCloseHandler、最後一標籤摺疊列、佈局 undo 歷史等行爲與點 × 相同。
  5. preventDefault() 抑制 Chromium 中鍵自動滾動;stopPropagation() 避免 dockkit 把中鍵當成選中。
  6. 監聽註冊在 ctx.effect 中,禁用或卸載插件時監聽一併移除。

浮動窗沒有 tab chip:中鍵落在標題區時,插件會觸發 kit 自帶的關閉按鈕路徑,等效於點關閉按鈕。

明確不做的事

  • 不支持其他按鍵、手勢或快捷鍵關標籤。
  • 不操作後臺 Session,只作用於當前前景列可見的 chip。
  • 依賴 dockkit 的 DOM 標記(data-dockkit-tab、data-dockkit-tab-close、data-sidebar-right-session);若未來 DSH 改名,手勢會靜默失效,不會誤關。
  • 中鍵仍先被瀏覽器接收,關閉發生在 pointerdown,而非 auxclick;無法變成與原生 chip 完全同層的內置行爲。

技術實現上,在 document 上捕獲監聽是爲了搶在 React 18 根容器委託的 onPointerDown 之前執行;倉庫含 test/react-delegation.spec.tsx 驗證中鍵不到達 chip 處理函數、左鍵仍正常。

環境與依賴

根據倉庫 package.json:

  • Node:>=22.17.0
  • DSH:>=0.2.1-rc.5 <0.2.2-0
  • 當前包版本:0.1.1(Release 徽章指向 v0.1.1)
  • 客戶端注入:@deepseek-ai/dsh-client-ui-sidebar-right

安裝與啓用

官方 README 給出的方式是從本倉庫構建並打包,再在桌面客戶端裏安裝 .tgz,不是憑插件名拼接 CLI 的 dsh plugin add github:... 命令。步驟如下。

  1. 在克隆或解壓後的倉庫根目錄安裝依賴並校驗構建:
pnpm install
pnpm check                       # typecheck · build · vitest
pnpm pack                        # -> dist/dsh-middle-click-tab-close-0.1.0.tgz

說明:pnpm pack 輸出文件名在 README 示例中爲 dsh-middle-click-tab-close-0.1.0.tgz;安裝時使用 dist/ 下實際生成的 tgz 文件名即可。package.json 中 version 爲 0.1.1,打包產物版本以本地 pnpm pack 結果爲準。

  1. 在 DeepSeek Harness 桌面應用中打開 Settings → Plugins,安裝上述 dist/*.tgz,然後重啓應用。資料寫明:運行中的 profile 在啓動時纔算模塊解析圖,新 bundle 需下次啓動才能正確 import entry。Web 客戶端在重啓後還需刷新頁面。

插件無配置界面;安裝並重啓後即生效。

典型用法

  1. 啓動已安裝插件的 DSH 桌面客戶端並完成一次應用重啓與 Web 頁刷新。
  2. 在右側邊欄打開若干可關閉標籤(如 Report、Terminal 等帶 × 的頁)。
  3. 在標籤文字區域按下鼠標中鍵:標籤應關閉,且與該標籤註冊的 close handler 行爲一致。
  4. 對唯一 Guide 標籤中鍵:應無關閉效果(與無 × 的官方行爲一致)。
  5. 若有浮動側欄窗,在中鍵點擊標題欄區域:窗體應通過 kit 關閉按鈕同路徑關閉。

開發調試時,可用倉庫腳本在隔離 profile 中加載 bundle(不修改本機正式 profile):

scripts/dev-profile.sh boot 19498     # isolated DSH home under .dev-home/
scripts/dev-profile.sh url 19498      # prints the served bundle URL
scripts/dev-profile.sh remove

手勢在真實桌面 GUI 上的驗證 README 標明需人工確認;自動化測試覆蓋 jsdom 行爲與 React 委託順序,不含 live middle click。

適用場景與注意

適合誰: 長期在 DSH 右側邊欄切換文件、終端、交付物等標籤,且習慣瀏覽器式中鍵關標籤的客戶端用戶。插件星標在資料中爲 0,屬早期社區工具,使用前可自行瀏覽源碼與 CI 狀態。

權限與安全: 插件隨當前 DSH 進程與用戶 profile 加載,在瀏覽器上下文中監聽指針事件並調用官方 sidebarRight.close。安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認接受其 DOM 解析與事件攔截方式。

生態說明: DSH 採用「一切皆插件」的擴展思路;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係,本文安裝步驟以倉庫 README 爲準。

結尾

dsh-middle-click-tab-close 用很小的 browser 半包補上了右側邊欄標籤的中鍵關閉,並刻意對齊官方 sidebarRight.close 而非模擬點擊 ×,以便 close handler 與佈局歷史與內置 UI 一致。若你需要這一手勢,可按 README 打包安裝並在重啓後試用。

  • 插件目錄:https://www.skillhub.cn/plugins/icrefin/dsh-middle-click-tab-close
  • 源碼與說明:https://github.com/icrefin/dsh-middle-click-tab-close
羽毛球分组比赛记分
小程序二维码

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

小夜