Uninote
Uninote
用户根目录
brdr
common
programming
docs
tests
后端试题
问题讨论

编辑器导航历史

用户行为

  • Alt+Left 执行“后退”,命令 ID 为 navigation.goBack。
  • Alt+Right 执行“前进”,命令 ID 为 navigation.goForward。
  • 两个命令显示在命令面板和快捷键设置中,默认按键可由用户修改或删除。
  • 原生主菜单提供 Go → 后退、Go → 前进、Go → 下一处差异 和 Go → 上一处差异,菜单点击复用对应的可配置命令;差异导航默认显示 Alt+N / Alt+P。
  • 导航历史与标签顺序、最近使用标签列表相互独立。
  • 跳转后关闭当前标签时,返回最近查看且仍打开的页面;不会按标签栏位置选择相邻页面。
  • 文件树连续打开的预览标签即使被替换,仍保留在导航历史中。
  • 返回到已被替换的预览文件时,应用会从当前笔记库重新读取该文件,并继续使用预览标签。
  • 后退后打开另一位置会清除原有的前进分支。
  • 点击或按 Enter 激活文档大纲项时,跳转前后的位置都会加入历史;大纲内仅移动焦点不会产生历史。
  • 通过 Quick Open 激活当前文件、全库或收藏大纲项时同样记录跳转前后的准确位置;跨文件跳转不会记录目标文件顶部这一临时位置。
  • 点击当前文件标题链接或 Markdown 文件标题链接时,来源位置与最终标题位置会加入历史。
  • 跨文件标题链接不会记录目标文件顶部这一临时位置;一次后退直接返回来源,一次前进恢复最终标题。
  • 链接无效、越界或目标不存在时不会增加历史位置。
  • 切换笔记库或恢复另一笔记库会话时会清空当前窗口的导航历史。

视图恢复

  • 每个历史位置保存编辑器选区、选区方向、横向滚动位置和纵向滚动位置。
  • 每个历史位置保存预览滚动位置以及离开时聚焦的编辑或预览窗格。
  • 跨文件跳转会在来源预览 DOM 移入缓存前记录位置,后退可恢复链接点击前的预览视口。
  • 历史位置同时保存当前行及相邻行的文本锚点;前进或后退时根据最新正文动态解析实际行,因此在目标位置之前插入或删除内容不会造成跳转偏移。
  • 返回已打开标签时复用该标签的 CodeMirror 编辑页,不重建其撤销与重做记录。
  • 历史中的文件已关闭且不属于当前笔记库,或文件已移动、删除时,应用保留原历史游标并显示非模态提示。

实现与验证

  • src/renderer/navigation/history.mts 维护有界的线性历史、当前位置和前进分支。
  • src/renderer/runtime/navigation.mts 捕获资源标识和视图状态,并负责重新打开被替换的预览文件。
  • src/renderer/runtime/editor/view.mts 在异步预览渲染完成后恢复预览滚动和焦点。
  • node scripts/run.mts node --test test/navigation-history.test.mjs 覆盖前进、后退、视图更新、分支截断和失败回滚。
  • npm run test:smoke:navigation-history 在真实 Electron 渲染器中覆盖预览替换、按键分发、选区恢复、前进分支截断、Quick Open 大纲跳转,以及同文件和跨文件标题链接的前进/后退。

CodeMirror 坐标接入

  • 源码偏移继续使用 UTF-16,持久化选区方向和横纵滚动字段保持现状。
  • 可见首行、源码跳转和预览插值读取编辑器行块坐标,不再用全文镜像测量链接或查找命中。
  • 恢复视图与主动跳转分开处理;恢复经过测量校正,避免旧的延迟定位覆盖标签保存位置。
  • 导航目标仍由原有 Markdown 标题和路径解析规则决定。

module-extraction

phase-0-baseline

点赞(0) 阅读(30) 举报
目录
标题