Skip to content

Marksmith 墨匠 发版记录 ​

结构感知、本地优先的 Markdown 桌面工作台:删除也有语义

当前版本0.4.2
最近更新2026-10-20
Git 标签v0.4.2(另有 v0.4.1、v0.3.0、v0.2.1、v0.2.0、v0.1.0)
状态可用(0.4.2,当前只出 Windows 安装包)
平台Windows(NSIS;macOS / Linux 打包未落地)

0.4.2 — 2026-10-20 ​

打开项目 / 文档后命令行黑框一闪

  • Windows 的 GUI 子系统进程没有控制台,启动 git.exe / mmdc(.cmd) / headless 浏览器这类控制台子程序时,系统默认给子进程新建一个可见控制台窗口。Git 面板每 1.5 秒轮询一次 git status,所以一打开项目或文档就不断有黑框闪一下;打开文档时 applyLoaded 也会立刻 refreshGit
  • 新增 services::hide_console_window(Windows 加 CREATE_NO_WINDOW 0x08000000,非 Windows 空操作),git / mmdc / headless 浏览器三处 spawn 统一调用
  • 验证:同类 GUI 父进程起控制台子程序,不加标志时子进程 GetConsoleWindow()!=0,加标志后为 0;0.4.2 release 打开 README 后 12 秒内轮询 19 次 git,可见控制台窗口为 0;cargo test 71 项、e2e smoke 18 步、screenshot 14 张全过
  • 本站验收:安装包静默安装 → 注册版本 0.4.2 → 对已安装的 exe 跑 release-smoke(18 步全过)→ 静默卸载,安装目录已清空

0.4.1 — 2026-10-13 ​

修「点 X 关不掉程序」,并把「保存」这条路放进关窗确认里

用户反馈的是三件事:「关闭时报错」「无法保存文件」「无法不保存退出」——三条出在同一个关闭路径上。

  • 窗口关不掉:关闭请求由前端 onCloseRequested 接管,确认之后要靠 destroy 销毁窗口,而 capabilities 里漏了 core:window:allow-destroy(core:window:default 不含它,只有 allow-set-title 这类只读权限)。结果是点标题栏 X 不会关:没有未保存修改时完全没反应;有修改时点了「放弃修改并关闭」同样原地不动,控制台只留一句 window.destroy not allowed。权限是编译期写进二进制的,补齐后要重新构建后端
  • 关窗前能保存了:原来的关闭确认走系统 confirm,只有「放弃修改并关闭 / 继续编辑」两个按钮,用户在关窗前没有保存这条路——这正是「无法保存文件」的来源。现在换成本应用内三选一:保存并关闭 / 不保存并关闭 / 继续编辑(Enter 保存并关闭、Esc 继续编辑);保存失败、或「另存为」被取消时窗口保持打开,原因写到状态栏,而不是把窗口卡在那里
  • 不再丢最后一击键:编辑器到文档 store 的同步有 200 ms 防抖,在这一窗口内点 X 会因「还没有未保存改动」直接关掉;现在关闭 / 换文档前先 flush 待同步的改动
  • 写盘入口排队等上一次写盘落地,避免「保存并关闭」撞上自动保存(或连点两次保存)时被静默丢掉
  • 补 e2e:行为走查第 11 步发真实 WM_CLOSE,走通「继续编辑 → 窗口还在且仍是脏的」「保存并关闭 → 内容落盘 + 进程退出」「不保存并关闭 → 进程退出且不写盘」「保存失败后仍能退出」,发布产物上也走一遍关窗;视觉走查加入这张弹窗截图(13 → 14 张);顺带修掉 e2e 在 Windows 上自起 Vite 失败(bun 是 bun.cmd,spawn 直接调用报 EINVAL)

0.4.0 — 2026-10-08 ​

把「结构还原」的适用范围补全

  • 代码块里的裸源码现在也能还原:language=mermaid 的代码块(从别处粘来、或围栏输入规则没触发时留下的形态)内容里没有围栏,上一版识别不到、右键没有入口;现在按语言判断并自动补围栏后解析
  • 段里夹着源码时给引导:整段不是源码、但里面夹着表格或围栏源码时,右键会出现一条「还原为结构(先选中源码)」的提示项,选中那几行再右键即可还原
  • 补测试:单元测试 9 条(识别规则、语言判断、裸 mermaid 自动补围栏、反例),端到端加 2 条,冒烟从 16 步增到 18 步

0.3.0 — 2026-10-08 ​

补上「结构还原」:按文本合并不再是单向门

  • 原本「删除意图 → 按文本合并」把表格 / 图表降级成一段 Markdown 源码后,界面上再没有任何入口把它变回结构
  • 现在在源码上右键 →「还原为表格 / 还原为图表 / 还原为代码块 / 还原为公式」,走 Markdown 往返管线解析后原位替换;可识别 GFM 表格(含带冒号的对齐行)、```mermaid 围栏、其它围栏与块级 $$…$$,普通段落不会误出这个入口
  • 合并后的弹窗会提示「已按文本合并并保留 Markdown 源码;在这段源码上右键可选『还原为表格 / 图表』」,让用户知道这不是终点

0.2.1 — 2026-10-08 ​

修掉行为测试暴露的三个用户可见缺陷

  • 光标在正文里时全局快捷键失效:Ctrl+N / Ctrl+O / Ctrl+Shift+F 全都不响应——判断「焦点在输入框里就让位」时把可编辑的正文也算成了输入框;现在只让给真正的表单控件
  • 窗口标题永远不更新:缺 core:window:allow-set-title 权限,标题栏既看不到文件名也没有「已修改」标记;补齐权限并让网页标题与原生标题同步
  • 状态栏图表缓存计数滞后:渲染出新图表后计数不动;改为 Rust 侧广播 render-cache-changed、前端订阅即时刷新(不轮询、不重载)
  • 行为测试补齐:新增编辑器行为走查(10 步)、浮层与菜单走查(16 步),视觉走查扩到 13 张截图

0.2.0 — 2026-10-08 ​

菜单、最近文件与几处细节修补

  • 新增自绘右键菜单:链接 / 图片 / 图表 / 公式 / 表格 / 文本各有专属动作,删除类动作继承「删除意图」语义不再二次询问;非编辑区屏蔽 WebView2 原生菜单,输入框里仍保留系统菜单
  • 新增最近文件:侧栏只列最近 5 个,「更多最近文件」窗口支持按文件名 / 路径筛选、打开、单条移除与清空
  • 修字号设置写错作用对象:设置显示 16px、正文实际却是 15px(设置写在容器上靠继承,被 .ProseMirror 的固定字号覆盖);改走 CSS 变量 --ms-doc-font-size,改设置立刻生效
  • 修浮动菜单跑出屏幕:气泡菜单 / 表格菜单贴边时用「锚点中点 + 居中位移」定位,锚点靠顶或靠边就出界;统一走 placeFloating(偏好侧 → 放不下翻转 → 夹进视口),纯函数部分有单元测试
  • 修导出菜单文案折行,并把实现术语(headless)换成用户能懂的输出格式 .html / .pdf / .md
  • 端到端基建:Vite 忽略 tests/(e2e 写轨迹不再触发整页重载)、多实例按端口分配独立 WebView2 数据目录,脚本可并行跑

0.1.0 — 2026-10-08 ​

第一个可用版本:结构感知的 Markdown 编辑

  • 桌面壳与文件读写:打开 / 保存 / 另存,窗口与最近文件
  • Markdown 往返保真:没有改动的块逐字节保留原始源码,只有改动块重新序列化
  • 块级所见即所得(TipTap 3 + ProseMirror):标题、列表、任务列表、表格、公式直接在编辑区渲染
  • 删除意图解析器:在表格 / 列表 / 代码块 / 图片等结构边界按 Backspace、Delete 时弹窗选择删除语义(删字符 / 删整块 / 拆结构),不让用户猜
  • 图表:Mermaid 本地渲染 + Rust 磁盘缓存(按「类型 + 主题 + 内容哈希」缓存),带防抖、超时与错误回退
  • 图片:原始清晰度显示、点击进灯箱(滚轮 10%–1000% 缩放、可拖拽平移),粘贴/拖放的内容按内容寻址落盘
  • 导出:单文件 HTML(内联 CSS 与 SVG)与 PDF(调用本机 Edge / Chrome 无头打印)
  • Git 集成走本机命令行:状态、分支、领先/落后、变更列表、diff 与提交
  • 主题与设计系统:浅色 / 深色 / 跟随系统,样式令牌与原语集中在 src/styles/
  • 验证:前端单元测试 66 个、Rust 单元测试 68 个

与设计有意不同的地方 ​

以下几条是明确不做,不是待办:PlantUML(不引入 Java 依赖)、shadcn-svelte(改用自研原语)、 独立预览面板(编辑器本身即所见即所得)、「光标行显示完整 Markdown 标记」(与输入法/选区语义冲突)、 Git 走 git2 库(改用命令行)。

下载 ​

  • Marksmith_0.4.2_x64-setup.exe —— 6.5 MB,Windows 10/11 安装包(NSIS,当前用户安装,带 .md / .markdown 文件关联),SHA256 eafa6d98…4ecf6892

未签名

个人项目、没有代码签名证书:安装包首次运行可能被 SmartScreen 拦一下(「更多信息 → 仍要运行」即可); 浏览器下载后若带「来自 Internet」标记,介意的话对文件跑一次 Unblock-File。