dsh-files-menu
右侧栏「工作区文件」文件树的右键菜单。DSH 自带的文件树只有列目录(没有右键菜单), 这个插件给每一行补上菜单,把「复制文件地址」这类常用操作变成两次点击。
只作用于 Web 客户端,不改 app.asar,升级 DSH 后仍然有效。
截图


菜单项
| 文件行 | 文件夹行 |
|---|---|
| 打开 | 展开文件夹 / 折叠文件夹 |
| 复制文件地址 | 复制文件夹地址 |
| 复制相对路径 | 复制相对路径 |
| 复制文件名 | 复制文件夹名 |
| 在资源管理器中显示(仅桌面版可用时) | 在资源管理器中打开(仅桌面版可用时) |
- 复制文件地址 / 复制文件夹地址:
data-files-path里的绝对路径,原样复制。 - 复制相对路径:相对工作区根目录,分隔符统一成
/(例如refs/README.md)。 - 在资源管理器中显示:文件在资源管理器里选中;文件夹则直接打开(
openWorkspacePath)。 只有宿主报告支持时(remote.session.canOpenWorkspacePath())才出现这两项。 - 复制成功后底部弹出「已复制」提示,1.4 秒后消失。
交互细节:
- 右键任意一行打开;ESC、点空白处、滚动、窗口失焦都会关闭。
Shift+F10或菜单键也能打开,打开后可用 ↑ / ↓ / Home / End 在菜单项间移动,ESC 回到原行。- 菜单靠近窗口右下角时会自动往回收,不会超出窗口。
- 文件夹行右侧的展开状态决定显示「展开文件夹」还是「折叠文件夹」。
other类型行(例如挂载点)和文件树以外的区域保留浏览器原生右键菜单。
安装
收录到插件市场后,可以直接在 DSH 的 插件 → 发现 里搜索 dsh-files-menu 一键安装。
在那之前(或不想用市场):
在 DSH 的 profile 目录里建一个联结,并把这个包登记为 bundle。以桌面版 profile
(%USERPROFILE%\.dsh\profiles\desktop)为例:
# 1. 建联结
New-Item -ItemType Junction `
-Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-files-menu" `
-Target "<本仓库路径>"
# 2. 在 profile 的 package.json 里加依赖与 bundle(也可以直接跑本目录的 install.ps1)
# "dependencies": { "dsh-files-menu": "link:<本仓库路径>" }
# "dsh.profile.bundles": [ ..., "dsh-files-menu" ]
也可以从 GitHub 安装(无需先克隆):
dsh plugin --profile desktop add github:smellingtiger/dsh-files-menu
或者直接使用本目录里的一键脚本(会自动判断 $env:DSH_HOME、备份 package.json、写配置):
powershell -ExecutionPolicy Bypass -File .\install.ps1
powershell -ExecutionPolicy Bypass -File .\uninstall.ps1 # 卸载
安装或改动后必须完全退出 DSH 再启动。 插件的 bundle 列表在启动时读取, 运行期间新增的 bundle 不会被当前进程加载(资源路由会返回 404)。
结尾自检
启动后:
- 右侧栏「工作区文件」里右键任意文件,应出现五项菜单。
- 点「复制文件地址」,在任意输入框粘贴,应是完整绝对路径。
- 桌面版应能看到「在资源管理器中显示」并正常打开资源管理器。
没出现菜单时,先确认 DSH 是完全重启(托盘退出,而不是只关窗口),并检查
%USERPROFILE%\.dsh\profiles\desktop\package.json 里同时存在依赖与 bundle 条目。
实现说明
文件树由 @deepseek-ai/dsh-client-ui-sidebar-files 渲染,没有提供逐行的 slot,
所以本插件在 apply 里用事件委托监听 contextmenu,命中
li[data-files-entry][data-files-path] 后自己画菜单:
- 菜单样式只用
--dsw-*设计令牌,跟随明暗主题;不 require@deepseek-ai/dsh-client-ui-primitives,避免版本耦合。 - 所有 DOM、监听器、样式都由
ctx.effect管理,插件卸载时一并清理。 - 需要
locale、remote、remote.session三个服务;桌面能力探测失败时 静默隐藏「在资源管理器中…」项,其余功能照常可用。
开发调试
test/ 里有一个纯前端测试台:它伪造了文件树的 DOM 和客户端 ctx,加载
client.js,然后在无头 Edge 里跑断言并截图(CDP 驱动,不需要安装任何 npm 依赖)。
node test/verify.mjs # 断言 + 截图到 test/out
test/tree.html?selftest=1 可以直接在浏览器里跑同一套断言,页面标题变成
SELFTEST-PASS 即全部通过。Edge 不在默认路径时,用 EDGE_PATH 环境变量指定。
No comments yet. Be the first to write one.