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

实现“复制引用”和“复制引用(大纲)”并接入导航历史

Summary

提供文件引用和大纲引用。workspace.copyRelativePathWithOutline 默认快捷键为 Windows/Linux Ctrl+Alt+C、macOS Cmd+Alt+C;生成的 Markdown 链接跳转会进入现有“前进/后退”历史。

Key Changes

  • 根据目标标签保留的 caret 位置,查找当前位置或之前最近的标题;非折叠选择使用活动选择端。
  • 有所属标题时复制 [大纲标题](/仓库相对路径.md#唯一标题锚点);重复标题沿用现有 -1-2 锚点规则。
  • caret 位于首个标题之前或文档无标题时,回退为 [文件名](/仓库相对路径.md)
  • 对路径、锚点和链接文字做 Markdown/URL 安全编码;使用 / 开头的仓库根相对地址,保证从仓库任意目录粘贴都能正确解析。
  • 所有仓库内已保存 Markdown 标签和文件树 Markdown 文件的右键菜单增加“复制引用”与“复制引用(大纲)”。
  • 标签或文件树中已打开的文件使用其独立编辑器页面保留的 caret;文件树中未打开的文件退化为文件引用,不切换或打开标签。
  • 命令面板和快捷键作用于当前上下文中的标签或文件树条目;未保存文档、搜索结果、文件夹及仓库外文件不提供引用命令。
  • 复制操作不改变标签、caret、选择、滚动位置或导航历史,仅在用户点击生成的链接时记录导航。

前进/后退集成

  • 将 Markdown 标题链接、同文件路径链接和跨文件路径链接统一接入现有 NavigationHistory
  • 点击链接前保存来源文件、caret、选择、编辑器/预览焦点及滚动位置;成功到达目标标题后保存最终目标状态。
  • 同文件跳转强制形成两个历史位置,使“后退”返回跳转前的位置,“前进”再次到达指定标题。
  • 跨文件跳转只形成“来源 → 最终标题”两个位置,不把目标文件顶部暴露为额外的中间历史步骤。
  • 预览区的异步渲染完成并落实标题跳转后,再更新目标历史状态,保证前进能恢复准确标题和预览滚动位置。
  • 无标题文件链接跳到文件顶部并进入历史;无效、越界或不存在的链接不新增历史记录。
  • 前进/后退恢复时继续复用现有标签重开、编辑器/预览焦点和滚动恢复机制。

Interfaces and Documentation

  • 新增命令 ID:workspace.copyRelativePathWithOutline
  • 新增 workspace.copyReference 命令,不设置默认快捷键。
  • 大纲引用默认绑定改为 ctrl+alt+c,macOS 为 meta+alt+c
  • 提取可单元测试的链接构造逻辑,统一处理 caret 行、大纲归属、重复标题、编码和无标题回退。
  • 不修改 IPC、持久化格式或原有“复制相对路径”行为。
  • 更新功能清单、工作区路径复制说明、快捷键命令文档和导航历史说明。

Test Plan

  • 单元测试覆盖 ATX/Setext 标题、嵌套大纲、标题行及正文 caret、首标题之前、无标题、重复标题、中文及特殊字符。
  • UI smoke 测试覆盖标签与文件树菜单、活动/非活动标签各自 caret、未打开文件退化、命令面板及 Ctrl/Cmd+Alt+C
  • 从根目录和嵌套目录笔记粘贴生成链接,验证编辑器与预览区均能跳到准确文件和标题。
  • 验证同文件、跨文件、文件顶部和异步预览跳转均可后退到来源、前进到最终目标,且没有多余中间历史点。
  • 验证失败链接不污染历史,普通“复制路径”“复制相对路径”和已有大纲点击导航不回归。
  • 运行完整 npm run validate,检查工作树,仅提交本次相关文件并推送当前远端;最终报告提交哈希。

Assumptions

  • “当前仓库的其他地方”指本应用当前笔记库内的 Markdown 文档。
  • 文件树中的未打开文件没有 caret,因此“复制引用(大纲)”按约定退化为只包含文件的引用。

tech-arch

preview-editor

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