Lenonss/DSH_VsCodeMode

Lenonss/DSH_VsCodeMode

为 DeepSeek Harness 提供类 VSCode 编码体验:基于 Monaco 的中央文件编辑器(文件页签、Ctrl+P 快速打开、状态栏),并对 Agent 的 edit/write 结果进行交互式差异审查(逐处采纳/拒绝、回滚、归档),状态跨重启持久化。

Git 与代码评审code-reviewdeepseek-harnessdeepseek-harness-plugin

dsh-vscode-mode

DSH 上的类 VSCode 编码体验:Monaco 文件编辑器 + Agent 差异审查 + LSP 智能。
由 @dsh-external/dsh-edit-review 重构而来。
  • 📝 同屏编辑:DSH 0.1.5+ 官方右侧 Sidebar,AI 对话与文件编辑同屏
  • 🔍 差异审查:Keep / Undo / 回滚 / 归档,状态持久化重启不丢
  • 🧠 LSP 智能:转到定义 / 查找引用 / Peek 多结果选择 / 智能补全(注释索引)/ 签名帮助
  • ⌨️ 命令面板:Ctrl+Shift+P,19 条命令开箱即用,可编程扩展

目录

  • 特性
  • 安装
  • 使用指南
  • 配置
  • 截图
  • 开发
  • 常见问题
  • 更新日志

特性

1. 侧边栏文件编辑(推荐形态)

检测到 DSH 0.1.5+ 官方右侧 Sidebar(ctx.sidebarRightTabs / ctx.sidebarRight)时, 编辑器注册为官方侧边栏 Tab,AI 对话(中央)与文件编辑(右侧)同屏,支持官方 多标签 / 分栏 / 浮出 / 全屏,打开路由即开即展开,官方引导页提供入口。

  • 形态优先级:官方 Sidebar > dsh-better-sidebar

(桥已归档,仅作旧版回退)> 中央文件编辑页签(零新依赖完整可用); 编辑器顶部与设置页「兼容性」子 Tab 给出对应引导。

  • 文件链接(DSH 0.1.5+):聊天 / 文件树链接经官方 ctx.sidebarRight.openResource

直达右侧栏;「文件链接使用工具」为 自动 / VSCodeMode 时以 extension 档认领 dsh-resource://file/**(Monaco 打开,含行号定位),为「官方侧边栏」档时走 官方文本查看器;畸形地址自动回落官方查看器。

  • 文件页签:脏点 / 关闭 / 「+」打开 / 右键菜单 / 固定(📌 排最前、隐藏 ×、

随工作区持久化;固定 = 保护,批量关闭永不误关固定页签)。

  • 页签数量上限(通用设置 maxOpenEditors,默认 10,0 = 不限制):超限时自动

关闭最久未使用的页签;固定页签与当前活动页签受保护,脏页签在关闭前静默落盘。

  • 页签栏滚轮横滚:页签栏溢出(出现水平滚动条)时,鼠标滚轮(含触控板纵向手势)

直接横向滚动页签栏;不溢出时不接管,Shift+滚轮 沿用浏览器原生横滚。

  • 页签右键菜单(对齐 VS Code):添加到对话 / 关闭·关闭其他·关闭右侧·关闭已

保存·全部关闭(Ctrl+F4 关当前)/ 复制路径·复制相对路径 / 在文件资源管理器 (视图)中显示。关闭前未保存页签静默落盘;浏览器无法实现的条目(向右拆分 / 新窗口)不提供。

  • 工作区搜索填充:编辑器有选中时执行「工作区搜索」(当前键位见官方快捷键目录),

选中文本自动填入搜索框并立即搜索(多行选区取首行;填入后全选,便于直接改写)。

  • Markdown 预览(v0.5.3):打开 .md / .markdown 后,工具栏「预览」按钮、

Ctrl+Shift+V 或命令栏「切换 Markdown 预览」切入 GFM 渲染(标题/列表/表格/代码块/ 引用/KaTeX),「以源码打开」切回编辑。渲染走官方 MarkdownText 原语,零新增依赖、 自动跟随 DSH 主题;旧版 DSH 缺该原语时降级为纯文本预览。活动文件不是 Markdown 时 不吞 Ctrl+Shift+V(保留「粘贴为纯文本」)。

  • DSH 计划模式接入:工作区 plans/、DSH .dsh/plans/ 下的 Markdown 计划文件,

以及成功生成且以 # 计划: / # 计划: 标题显式关联的 Markdown,默认以预览打开; 指定行号的链接仍进入源码定位,普通 Markdown 的既有打开方式不变。 当前会话成功写入/修改计划文件、提交完整计划后自动打开预览;刷新、历史翻页、重连和 切换会话不会重播旧计划。官方「打开计划」及待审批计划同样转入文件编辑器的只读计划 页签(最多保留 32 份,退出编辑器后不持久化虚拟正文),不写磁盘、不接入 LSP/SVN/保存; 审批仍使用对话中的官方控件。打开失败可点击「在官方计划查看器打开」,不影响原审批。 缺少官方 Sidebar/计划服务的旧版 DSH 保留原查看器;自动生成检测需要 Session 事件源。

  • Monaco Editor:语法高亮 / 行号 / Ctrl+F / Ctrl+G / Ctrl+S /

700ms 防抖自动保存;顶部工具栏显示 路径 / 语言 / Ln,Col / 保存状态,提供 差异 / 侧边栏 / 刷新入口。

  • 导航历史:后退 / 前进跨文件恢复焦点位置(工具栏 ←/→、Alt+←/→、

Ctrl+Alt+- / Ctrl+Shift+-、鼠标侧键 XButton 均可触发);后退后新导航 自动清空前进栈。

2. 命令栏与指令系统(v0.2.0)

Ctrl+Shift+P(或 F1)唤出 VS Code 式命令面板:输入即过滤(中文 / 分类 / 命令 id 均可命中),↑↓ 选择、Enter 执行、Esc 关闭,每行显示 命令名 / 分类 / 当前键位;需要打开文件的命令在空编辑器时自动隐藏。

  • 单一数据源:命令目录(ui/commandCatalog)驱动命令栏和官方快捷键目录;

键位查看/改绑统一走 DSH 官方快捷键配置(设置 → VSCodeMode → 通用 → 「打开官方快捷键配置」,或 Ctrl+/),插件不再自建录键界面,绑定由官方服务持久化。 旧版 DSH 没有该服务时继续使用原有窗口按键派发,旧 keybindings 设置仍可生效。

  • 开放注册表:window.__edrvCommands__ 暴露 register() 注册命令;插件

不再提供独立的运行时键位注册,改用 DSH 官方 shortcuts 配置。

  • 开箱 20 条命令:保存 / 快速打开 / 在文件浏览器中打开 / 显示所有命令 /

切换侧边栏 / 工作区搜索 / 切换 Markdown 预览 / 后退·前进 / 上下页签 / 关闭当前页签 / 上下编辑行 / 转到定义 / 查找引用 / 触发 AI 补全 / 配置代码片段 / 插入代码片段 / 选中内容加为引用。

3. 代码片段(v0.3.0,VS Code 兼容)

支持 .code-snippets:Ctrl+Shift+P →「代码片段:配置代码片段」打开居中浮窗 (现有片段文件列表 + 新建入口),在 Monaco 中按普通文件编辑(JSON 高亮 / 保存即生效 / 支持 scope 字段)。

  • 两处片段库:全局 ~/.dsh/snippets/(所有项目)+ 项目

/.dsh/snippets/(随仓库共享);文件名即生效语言 (lua.code-snippets → 仅 lua,global.code-snippets → 全语言), 新建时可选生效语言。

  • IntelliSense 补全:编辑 .lua 等文件时 prefix 自动列出(片段图标 +

body 预览,Tab / Enter 展开,$1 / ${2:默认值} 占位符与 $TM_* 变量可用);也可「插入代码片段」按语言筛选插入光标处。

  • RPC:snippets.list/read/save/remove/entries;保存后自动刷新补全缓存。

4. 快捷引用(v0.3.0)

选中内容后 Ctrl+U 把选中行范围加为引用(送入对话上下文,等价 VS Code 的 「Add Selection to Chat」);无编辑器 / 无选中时该键位不吞键,正常输入不受影响。 (v0.3.1 修复可用性判定:改用与输入实现无关的 .edrv-editor-row .monaco-editor 判据,替换被 Monaco EditContext 输入通道取代的 textarea.inputarea 探测。)

  • 插入点跟随输入框光标(caretSpan();无光标信息回落文档末尾,选中区域插在

选区右边界而不替换),修复「连续添加多个引用时既有 chip 被销毁并重复为纯文本」。

  • 通道被拒时降级为就地纯文本(保留既有 chip 与正确分隔空格);两条通道都不可用

则不写任何内容并提示重试。

5. LSP 智能(编辑器内)

F12 / 右键「转到定义」、Shift+F12「查找所有引用」、Ctrl+点击 引用导航、 Ctrl+hover 可导航标识符下划线提示。v0.4.2 起统一委托完整 Monaco 原生命令: 多结果弹 Peek 让用户选,单结果直跳,取不到定义自动降级「转到引用」。

  • 智能补全:输入 . / : / ( / [ 自动弹出候选(Ctrl+Space 手动触发)。

EmmyLua 的注释索引(---@class / ---@field / ---@type)会被解析为真实的成员列表, 即对 ---@class 标注的实例打 p. 能列出注解声明的字段/方法;候选项带类型图标、 弃用标记与片段展开(${1:占位})。文档走 completionItem/resolve 惰性拉取,列表响应保持轻量。

  • 关键字与注解类型补全(v0.11.0):LSP 服务器没有返回候选时补齐 Lua 保留字

(local / function …,luaReservedWords);---@type / ---@param 等注释内的基础类型 (number / string …)即使在运行中 quickSuggestions.comments='off' 也会自动弹出; 是否请求补全候选按适配器能力位裁决(completionCap)。

  • 成员回退补全(v0.11.0):EmmyLua 没给出成员列表时按当前作用域推导可用成员

(memberScope),补全不再空白。

  • 签名帮助:函数实参处(输入 ( / ,)显示参数签名并按当前实参高亮;

多签名可切换。

  • 定义查找带降级链(definition → declaration → 引用推导);参数 / 局部变量

(this、pTarget 这类)同样能跳到声明。

  • 相关踩坑与修复见 常见问题 第 1–4 条。

6. 差异审查(核心能力)

Host 捕获 agent 的 edit / write(tools/result),客户端统一使用唯一一个 挂在 DSH conversation.input.dock 的 DiffBox 实例:

  • 编辑器未打开 → 紧凑「差异 N 个文件 · 查看下一个」按钮,点击自动打开侧栏编辑器

并聚焦差异;编辑器打开后 → 完整操作条(Keep / Undo / 跳转 / 回滚 / 归档对比), 不会再出现第二个差异栏。

  • header 差异角标 + DiffLauncher 全局总览 + 归档 / 批次回滚;状态持久化到工作区

旁车 .dsh-edit-review.json(重启不丢)。

  • v0.4.3 起单文件 Keep / Undo 覆盖冲突差异(pending hunk 已被后续修改覆盖):

Keep 记账后归档;Undo 对已不在文件中的差异不改动文件、直接按不采纳归档 (状态栏提示「其中 N 处已不存在于文件,未改动」)。

7. Monaco 离线分发

assets/vendor/monaco AMD 构建随包发布,经 /edrv/vendor/* 前缀路由全离线可用。 版本锁定 monaco-editor@0.42.0-dev-20230906(commit e7d7a5b0),用 node scripts/vendor-monaco.mjs [--force] 从 npm registry 复现铺入 (版本 + commit 双重断言,防静默换错构建)。

  • v0.4.0 起为官方完整构建(referencesController / peekView / gotoSymbol

齐备),修复「查找引用完全没反应」;本地化只保留英文基线 + 简体中文 (KEEP_NLS),sourceMappingURL 铺入时剥离(官方指向未分发的 min-maps/); 构建后 vendor 约 10.3MB(替换前 21.5MB)。

8. PDF 浏览与编辑(v0.1.55)

打开 .pdf 在编辑区页签内直接浏览(连续滚动 / 翻页 / 缩放 / 文本选择, cmaps 支持中文渲染);工具条进入注释编辑:✎ 文本框 / 🖌 画笔 / 🖍 高亮, Ctrl+S 或 💾 保存把批注写回原文件(pdfDocument.saveDocument() → edrv.saveBinary base64 回写,工作区边界 + 32MB 上限约束)。

  • 引擎离线 vendor 于 assets/vendor/pdfjs(build + viewer + cmaps +