# 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`(类型名、打开命令 `"" "%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 分支)、安装包关联注册实效、双击冷启动 打开、已运行双击第二个文件转发到主窗口、菜单项注册后在系统 设置里选默认全流程。