三条链路:①tauri.conf bundle.fileAssociations 注册 md/markdown, 新版安装包重装后出现在「打开方式」候选;②文件菜单「设为 .md 默认打开方式…」:Rust 命令经 reg.exe 写 HKCU 的 ProgID NewMarkdown.md/OpenWithProgids/SupportedTypes(免管理员、指向 当前 exe),再打开系统默认应用设置让用户确认一次(Windows 不许 程序直接抢默认);③双击打开:单实例插件转发第二实例参数到待 打开队列+聚焦主窗口,冷启动读 env args,共用 md_files_from_args 过滤;前端 take_pending_open_files 取走逐个打开,只由 main 窗口 消费防子窗口抢文件。命令数 31→33 对账,参数过滤纯函数已抽 crate 实测,vitest 154+2、构建通过;Windows 构建与双击全流程待真机验。
2.6 KiB
2.6 KiB
docs/32 .md 文件关联(默认打开方式)
2026-11-15 用户要求:「支持设置 md 格式的打开方式」。目标:在资源 管理器双击 .md 能用本程序打开,且程序内能发起设置。三条链路:
1. 安装器注册(tauri.conf.json)
bundle.fileAssociations 增加 md/markdown(name=NewMarkdown,
role=Editor)。NSIS/MSI 安装时写入关联注册信息,本程序出现在
「打开方式」候选里,用户在打开方式对话框勾「始终」或在系统设置
里选一次即设为默认。注意:需用新版安装包重装一次才生效。
2. 程序内发起设置(文件菜单)
「文件 → 设为 .md 默认打开方式…」(仅桌面模式):Rust 命令
register_file_association 用 reg.exe 写当前用户注册表(免管理员):
ProgID NewMarkdown.md(类型名、打开命令 "<exe>" "%1"、图标)、
.md/.markdown 的 OpenWithProgids、Applications 的 SupportedTypes 与
打开命令——便携版/未走安装器的场景也能注册,且指向当前 exe 路径。
写完后打开 ms-settings:defaultapps 并弹窗说明:Windows 不允许
程序直接抢占默认(UserChoice 带哈希校验),最后一步必须由用户
在设置里把 .md 选为 new-markdown,只需一次。
3. 双击真正打开文件
- 单实例插件(tauri-plugin-single-instance,须最先注册):程序已
运行时双击第二个文件不再起新进程,第二实例的参数经回调转入
待打开队列并发
pending-open-files事件,同时聚焦主窗口。 - 冷启动:setup 里读
std::env::args,与第二实例共用纯函数md_files_from_args过滤(跳过开关项、只收存在的 .md/.markdown), 存入PendingOpen队列。 - 前端:新命令
take_pending_open_files取走队列并逐个 openPath。 主窗口在启动流程末尾拉一次(冷启动),并监听事件随时拉(热转 发)。只由 label=main 的窗口消费:子窗口(?file= 打开的)跑 同一套 App,不拦会把文件抢到子窗口里。
命令总数 31 → 33。
验证
- 参数过滤纯函数抽入独立 crate 实测:开关项/.txt/不存在的文件被 排除,.md 与 .markdown 存在文件入选。
- rustfmt 语法解析通过;命令数对账 33=33;tsc 0;vitest 全过 (InfoModal 新增 1 例);生产构建通过。
- 沙箱验不了(待真机):Windows 完整构建(含单实例插件与 cfg(windows) 的 reg.exe 分支)、安装包关联注册实效、双击冷启动 打开、已运行双击第二个文件转发到主窗口、菜单项注册后在系统 设置里选默认全流程。