前言¶
在 DeepSeek Harness(DSH)里,右侧边栏适合快速打开、预览项目文件;主工作区通常留给会话与对话。长文档、宽表格或复杂代码在窄栏里编辑会吃力,若把主工作区整块换成编辑器,又容易丢掉会话头部和边栏上下文。
DSH Main File Tabs(npm 包名 dsh-main-file-tabs)是社区维护者 l741589 提供的客户端插件:把边栏里已在预览的文件以页签形式打开到主工作区,并与侧边栏共用同一份文档与同一套 TextEditor,实现约 45ms 量级的双向文本同步,以及 Markdown 分屏编辑/预览。插件通过 DSH 的 Conversation View 承载「文件」工作区,不替换整个会话界面。
这是什么¶
- 定位:面向 DSH Web / Desktop 的纯 JavaScript 客户端插件,零构建,安装后无需编译步骤。
- 分类:客户端(Client 端注册 UI 与
mainFileTabs服务;Host 半端为空实现)。 - 许可证:MIT(见仓库
LICENSE)。 - 生态说明:插件可在 SkillHub 目录页 查阅简介;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。DSH 本身遵循「一切皆插件」的扩展方式。
核心功能¶
下面介绍 README 中已明确列出的能力(冲突处以仓库文档为准)。
打开与页签
- 一键打开:右侧边栏文件工具栏右上角、页签「…」菜单,或原生预览工具栏。
- 主工作区支持页签切换、关闭、中键关闭;右键可关闭当前、全部、左侧全部、右侧全部;文件图标与侧边栏一致。
编辑与渲染
- 实时双向同步:侧边栏与主工作区各挂一个 CodeMirror 视图,通过
view.dispatch转发变更;Markdown 预览随编辑刷新。 - 与侧边栏一致:复用
dsh-better-sidebar注册的TextEditor与 viewer 注册表,保留语法高亮、Markdown 预览、Mermaid、TOC、图片解析等。 - Markdown / HTML / JSONL 支持「编辑 / 预览 / 分屏」。
- 图片、PDF、HTML 等可从侧边栏以只读预览方式打开到主工作区;Office 文档仍在侧边栏预览。
会话布局
- 会话头部新增 「文件」 View;点 「对话」 可回到聊天,右侧边栏与会话头部保留。
扩展
- Client 服务
mainFileTabs:其他插件可openFile、监听onDidChange/onDidOpen/onDidClose等,并查询getOpenFiles、getText(详见 GitHub README)。 - 界面文案跟随 DSH locale,支持中英双语。
环境要求¶
安装前请核对版本依赖(来自 README Requirements):
- DSH
0.2.1-rc.2或更高,且 profile 带有 Web UI(例如desktop)。 - dsh-better-sidebar
0.28.x(本插件复用其TextEditor与 viewer 注册表)。 - 平台:DSH Desktop 支持的操作系统(Windows / macOS / Linux);Web 端 badge 标明 Web / Desktop。
安装与启用¶
从 npm 安装(推荐)¶
把 desktop 换成你实际使用的 profile 名称:
dsh plugin --profile desktop add dsh-main-file-tabs
安装完成后完全退出并重新打开 DSH(桌面版若缩到托盘,需从托盘退出)。重新打开后按 Ctrl+R / Cmd+R 刷新页面。README 说明:安装通常不会执行构建脚本,一般不会出现 approve-builds 提示。
从 GitHub 安装(备选)¶
dsh plugin --profile desktop add github:l741589/dsh-main-file-tabs
适合固定到某个 commit、或尚未有 npm 版本的场景。
确认是否生效¶
重启后在右侧边栏打开一个 .md 文件,工具栏右上角应出现 「在主工作区打开」。若未出现:
- 确认
dsh-better-sidebar已安装并在当前 profile 启用; - 使用页签「…」菜单中的「主工作区打开」;
- 在 DevTools Console 查看是否有
[dsh-main-file-tabs]前缀日志。
安全与权限:插件以当前 DSH 进程权限运行,安装前建议阅读 源码仓库 与 MIT 许可证,自行评估是否纳入工作环境。
典型用法¶
经过上面的安装步骤后,可按 README 使用 一节操作:
- 在右侧边栏打开文本类文件(
.md、.txt、代码文件等)。 - 点击 「在主工作区打开」,或页签菜单中的同名项。
- 会话头部切换到 「文件」 View,文件以页签出现在主工作区。
- 在任一侧编辑,另一侧同步;Markdown 预览随输入更新。
- 对 Markdown / HTML / JSONL 可使用工具栏 「分屏」:左侧编辑、右侧预览。
- 需要回到对话时,点文件工作区右上角 「对话」;边栏与会话头部仍在。
其他 Client 插件可通过服务 API 编程打开文件,例如:
const api = ctx.get('mainFileTabs')
const handle = api.openFile({
path: 'docs/design.md',
line: 12,
})
await handle.ready
openFile 若目标文件已在侧边栏打开且含未保存文本,会优先采用侧边栏实时文本而非磁盘旧内容。完整字段与事件说明见仓库 插件 API 章节。
工作原理(简要)¶
插件不复制编辑器实现,而是:
- 在
conversation.view注册文件工作区,避免占用全局mainpanel; - 对两侧 CodeMirror 做最小差异同步,并同步
TextEditor的 Markdowndraftstate,使远程更新时预览也能刷新而不重挂编辑器。
适用场景与注意¶
适合
- 在 DSH 会话里边聊边看/改项目文档或代码,又希望主区域有足够宽度;
- 需要 Markdown 分屏预览,且希望与侧边栏能力一致;
- 编写 Client 插件,需要监听主工作区/侧边栏同一文件的文本变化。
已知限制(摘自 README)
- 可编辑页签主要针对
fsRead文本格式;图片、PDF、HTML 在主工作区为只读预览。 - 主工作区与侧边栏交替保存同一文件时,可能出现保存冲突;侧边栏可 重新加载。
- 同步实现依赖
dsh-better-sidebar内部结构,其大版本变更可能导致同步退化,但不影响侧边栏原有功能。 - 未保存草稿仅在浏览器内存;刷新页面会丢失;关闭脏页签会确认。
- 通过 API 为非当前
sessionId打开文件时,页签归属该会话,但不会自动切换会话。
结尾¶
dsh-main-file-tabs 解决的是「边栏够用、主区不够宽」与「占满主区又丢会话布局」之间的矛盾:同一份文档、同一套编辑器,在主工作区以页签继续编辑,并保留 DSH 会话与右侧边栏。