🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

按扩展名打开 HildebrandYu/dsh-open-with

DeepSeek Harness
HildebrandYu17 天前有提交已提供中文文档扫描:含敏感能力

让 DSH 按扩展名选用指定应用打开文件,不改系统默认

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/20 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add HildebrandYu/dsh-open-with
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/20·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 17 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 8 处,展示前 8 条)
  • 执行外部命令固定命令
    plugin/index.mjs:162
    execFile("/usr/bin/open", [flag, spec, path], { timeout: 15000, signal }, (error) => {
  • 读取本地文件
    plugin/index.mjs:187
    stat = statSync(configFile);
  • 读取本地文件
    plugin/index.mjs:203
    rules = parseRules(JSON.parse(readFileSync(configFile, "utf8")));
  • 读取本地文件
    plugin/index.mjs:415
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    plugin/index.mjs:562
    const parsed = JSON.parse(readFileSync(configFile, "utf8"));
  • 写入本地文件
    plugin/index.mjs:569
    writeFileSync(temp, `${JSON.stringify(next, null, 2)}\n`, "utf8");
  • 写入本地文件
    plugin/index.mjs:570
    renameSync(temp, configFile);
  • 发起网络请求
    plugin/client.js:41
    const response = await fetch(configUrl(), init);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 可按扩展名设置「打开方式」:让 DSH 用你选的应用打开文件,不改 macOS 默认应用。含宿主插件和设置页。

README

由 DeepSeek 最新模型翻译生成
dsh-open-with — 为 DSH 提供按扩展名区分的「打开方式」 DSH 打开文件时把文件交给 macOS 处理,所以永远用系统默认应用。 这个插件给 DSH 单独建了一份按扩展名映射的应用表——Finder 双击仍用你平时的默认应用,而 DSH 的交付卡片、右侧栏预览和变更审查,打开的是你在这里选的应用。 - 设置 → 文件打开方式(新标签页)编辑这份映射;改动立即生效,不用重启。 - 规则存在 ~/.dsh/open-with.json:{"apps":{"docx":"/Applications/Pages.app"}} —— value 可以是应用的绝对路径、显示名称或 bundle id。没列出的扩展名沿用系统默认。 - 只影响 DSH 自己的「打开」动作。「显示文件位置」仍然在 Finder 里定位。 - 仅支持 macOS(它调用 /usr/bin/open)。MIT。 从插件市场安装,或从 GitHub 安装(dsh plugin add github:HildebrandYu/dsh-open-with),也可以从本地检出挂载 plugin/index.mjs(见下方「安裝」)。 中文說明 让 DSH 内按「开启」时使用你指定的 app,而不动 macOS 的系统预设 app。
展开完整文档(README 剩余 1 节)
dsh-open-with — 为 DSH 提供按扩展名区分的「打开方式」

DSH 打开文件时把文件交给 macOS 处理,所以永远用系统默认应用。
这个插件给 DSH 单独建了一份按扩展名映射的应用表——Finder 双击仍用你平时的默认应用,而 DSH 的交付卡片、右侧栏预览和变更审查,打开的是你在这里选的应用。

- 设置 → 文件打开方式(新标签页)编辑这份映射;改动立即生效,不用重启。
- 规则存在 ~/.dsh/open-with.json:{"apps":{"docx":"/Applications/Pages.app"}} —— value 可以是应用的绝对路径、显示名称或 bundle id。没列出的扩展名沿用系统默认。
- 只影响 DSH 自己的「打开」动作。「显示文件位置」仍然在 Finder 里定位。
- 仅支持 macOS(它调用 /usr/bin/open)。MIT。

从插件市场安装,或从 GitHub 安装(dsh plugin add github:HildebrandYu/dsh-open-with),也可以从本地检出挂载 plugin/index.mjs(见下方「安裝」)。

中文說明

让 DSH 内按「开启」时使用你指定的 app,而不动 macOS 的系统预设 app。
Finder 双击仍然是你平常的预设;只有 DSH 的文件卡片、右侧预览、变更审查这几个「开启」动作会被改写。

为什么不是 SwiftDefaultApps:SwiftDefaultApps(或 duti)改的是 LaunchServices 的全域预设,一改就是整个系统、连 Finder 双击都跟着变,而且它没有「只对某个 app 生效」的范围,也不能嵌进 DSH。
要「只在 DSH 里不同」,只能改 DSH 自己开启文件的那一步——就是这个外挂在做的事。

规则档

~/.dsh/open-with.json

{
"apps": {
"docx": "/Applications/Pages.app",
"md": "Obsidian",
"pdf": "/System/Applications/Preview.app"
}
}

value 也可以只写显示名称("docx": "Pages"),效果相同。

- key:副档名,docx、.docx、.docx、DOCX 都接受(正规化成小写)。
- value:app 的绝对路径或显示名称(例:Pages、Obsidian);也接受 bundle id(例:com.apple.Preview)。
- 没有列到的副档名 → 完全照原本行为(系统预设 app)。
- 这种万用键刻意不支援,避免一个手滑让所有文件都跑掉。
- 存档即生效,不必重启 DSH(外挂每次开启前会看 mtime 重读)。

目前规则(2026-10-18 扫过整个 BrainVault 后选定)

| 类别 | 副档名 | app |
| Markdown | md | Obsidian |
| Word | docx、doc、odt | LibreOffice |
| PDF | pdf | Stirling PDF |
| 试算表 | xlsx、xls、csv | LibreOffice |
| 简报 | pptx | LibreOffice |
| 纯文字 | txt、log、vtt | TextEdit |
| 点阵图 | png、jpg、jpeg、gif | Preview |
| 音讯 | wav、mp3 | QuickTime Player |
| 影片 | mp4 | VLC |
| 向量图 | svg | Google Chrome |
| 程式码 | py、js、mjs、cjs、ts、tsx、sh、rs、css | TextEdit |
| 设定/资料 | json、yaml、yml、toml、jsonl | Obsidian |
| 网页 | html | Google Chrome |
| 压缩 | zip | The Unarchiver |

共 36 条;没有列到的副档名维持系统预设。

设定页(GUI)

DSH 设定(⌘,)→ 左侧「档案开启方式」:

- 列出目前所有「副档名 → app」,每列一个下拉,换了立刻写回(不必按储存)。
- 「— 用系统预设 —」=删掉该条规则。
- 最下面一列可新增副档名(例:epub)+ app。
- 下方显示规则笔数与规则档路径。

资料走宿主路由 GET/POST /local/open-with/config;写入时保留 _readme 等其他栏位,采原子写入(暂存档+rename)。

补丁里的 entry 名称带 ?v=1 是刻意的:dsh-client-modules 会把每条 entry 的 package.json 按 loader name 快取一辈子;这个外挂第一次载入时 package.json 还没有 dsh.client,不快取破一次就永远不会把浏览器半编进前端。查询字串只影响 ESM 的模组身分,找 package.json 时会被忽略。
不要把它清掉,否则设定页会消失(要等下一次 App 重启才回来)。

它在 DSH 里怎么运作

1. DSH 开启文件的最终出口是 sessionController.openPath(),最后呼叫 macOS 的 open <path>。
外挂把它换成 open -a <你指定的 app> <path>。
2. 按鈕/選單要顯示哪個 app 是預設,來自 sessionController.fileApplications();插件把規則指定的 app 排到最前並標成 (default),所以按鈕文字和實際行為一致。
3. 你從選單「這次改用別的 app」時,只有選到規則指定的那個 app 才由插件接手,其餘照原流程。

完全不碰 LaunchServices、duti、defaults write;移除外掛即恢復原狀。

驗證

1) 外掛是否活著、規則是否載入、某個路徑會用哪個 app(乾跑,不會開啟)
curl -s http://127.0.0.1:51714/local/open-with | python3 -m json.tool

2) 連關聯 app 清單一起看(會即時問 macOS,不會開啟)
curl -s "http://127.0.0.1:51714/local/open-with?path=/Volumes/BrainVault/x.docx&apps=1" | python3 -m json.tool

3) 一鍵版
node scripts/verify.mjs "/Volumes/BrainVault/x.docx"

回應重點:

| 欄位 | 意義 |
| status.installed | true = 已接管 openPath(false 時看 status.error) |
| rules | 目前載入的規則 |
| error | 規則檔讀取/解析錯誤(壞檔時保留上一次成功的規則) |
| probe.spec | 這個路徑會用哪個 app(null = 照系統預設) |
| probe.apps | DSH 選單會看到的 app 清單(第一筆、default: true 就是按鈕上的那個) |
| last | 最近一次真正開啟的紀錄(成功或失敗原因) |

安裝

1. 插件市場(推薦)

DSH → 設定 → Plugin Market → 搜尋 dsh-open-with → 安裝 → 重載頁面。
(市場上架需要 repo 滿一天,收錄狀態見 https://github.com/HildebrandYu/dsh-open-with)

2. 從 GitHub 安裝(web profile)

dsh plugin --profile web add github:HildebrandYu/dsh-open-with

3. 本機 checkout 直掛(本機目前的做法)

~/.dsh/cordis.patch.yml:

- insert:
- id: open-with
name: 'file:///Volumes/BrainVault/30-CodingSkills/dsh-open-with/plugin/index.mjs'

再把 hmr.config.root 加上 .../dsh-open-with/plugin(改程式才需要熱重載;只改規則不用)。

plugin/index.mjs 往上一個目錄就是套件根,package.json 宣告了 dsh.bundle 與 dsh.client,所以設定頁的瀏覽器半會一起被載入。

移除

- 市場安裝:市場 → 已安裝 → 移除。
- 直掛:刪掉 # >>> open-with BEGIN 到 # <<< open-with END 那段(含 hmr 的 root),重啟 DSH。
- 規則檔 ~/.dsh/open-with.json 可留可刪;刪掉即完全回到系統預設。

授權

MIT,見 LICENSE。

已知限制

- 只影響 DSH 的「開啟」;「顯示文件位置」(Finder 選取)不受影響,仍是 Finder。
- 工作區外的檔案一樣適用(用絕對路徑);但路徑必須存在且能被 Host 解析,否則 DSH 會回錯誤。
- 選單裡若出現重複的 app(例如 Pages 與 /Applications/Pages.app),那是 macOS 關聯清單本身有兩筆;插件只把第一筆符合的標成預設,兩筆都能開。
- 選單中選擇別的 app 只影響那一次,不會改規則檔。
- DSH 升版若改了 sessionController 的介面,status.installed 會變 false 並在 status.error 說明;此時檔案會回到系統預設行為,不會壞掉。

檔案

package.json 套件根:dsh.bundle(插件市場安裝)+ dsh.client(設定頁) cordis.patch.yml 安裝時插入 profile 的 bundle patch plugin/index.mjs 宿主半:接管 openPath、規則、診斷與設定路由 plugin/client.js 瀏覽器半:設定頁「檔案開啟方式」 test/matching.test.mjs 規則比對與 install/uninstall 的單元測試 test/client.test.mjs 瀏覽器半的 bundle id/分頁註冊/URL 組法 scripts/verify.mjs 打診斷路由,印出規則、probe 與前端是否已收錄

測試:node --test test/(目前 10 項全過)。
预览分享卡片长什么样 ↓HildebrandYu/dsh-open-with
分享 · DeepSeek Harness Hub
HildebrandYu/dsh-open-with

让 DSH 按扩展名选用指定应用打开文件,不改系统默认

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部