Skip to content

[Bug] Live Preview 光标进入某行导致整行内联语法展开(含双击误跳转) #259

Description

@anyingiit

现象 / Actual behavior

Live Preview 模式下,光标进入任意一行(哪怕点在该行的空白处、或某个样式元素旁边的普通文字上),该行所有内联 Markdown 语法都会同时从渲染态翻转为源码态:

  • [[wikilink]] 全部展开为原始双括号语法
  • **粗体**、*斜体*、~~删除线~~、`行内代码` 的标记全部显现

更严重的连带问题:双击选中链接周边单词时会误跳转到其他页面。因为光标落点触发了整行展开,布局发生位移,双击的第二次点击落在被展开的 wikilink 命中区上,直接触发 onNavigate 跳转——用户只是想选个词,却被带离了当前笔记。

复现步骤

  1. 新建笔记输入:前言 [[目标页]] 中间 **加粗** 尾巴 \代码``
  2. 光标点击"前言"二字 → 整行全部展开为源码(预期:什么都不发生)
  3. 在 [[目标页]] 旁边的"中间"二字上双击选词 → 因整行展开导致布局位移,点击命中 wikilink → 直接跳转到"目标页"

GIF-1 · 参照行为:Obsidian

Image

GIF-2 · 本项目现状

Image

期望 / Expected behavior

与 Obsidian Live Preview 一致的元素级展开:只有光标严格所在的那一个内联元素显示原始语法;点击相邻空格或同行其他位置不展开任何东西;其他元素保持渲染态。

为什么这是 Bug 而不是特性

基于仓库历史事实(可复核):

  1. 产品需求文档规定的是元素级。prd.md:96(§4.1 实时预览机制):「当光标不在某个特定的 Markdown 结构(如 **加粗** 或 ![图片](url))内部时,将其折叠并替换为一个 Widget;当光标移入时,展开为源码供编辑。」——判定粒度是"结构(元素)",从未提及"行"。
  2. 最早的实现正是元素级。提交 9e2a5eb(2026-04-17)的信息自证其修复前状态:按元素区间逐个判断(selectionIntersects)。
  3. 当年缺陷的根因是隐藏手段,不是粒度。同一条提交信息写明:scroll click desync 由 color:transparent / font-size:0 这类"字符仍占位但不可见"的隐藏方式引起 CM6 坐标映射错位。
  4. 粒度改整行是被捆绑进来的越界变更。该提交在换用零宽 Decoration.replace(真正的治本修复)的同时,顺手把判定从元素级改成行级;diff 注释把 desync 归因于"transparent marks"——即变更 Feat/shaoyongqiang demo #1,而非元素级判定本身。没有任何需求/Issue/设计文档要求行级行为。
  5. 行级化的唯一辩护理由是错误的。提交信息称 "This matches Obsidian's approach: clicking anywhere on a line reveals all formatting markers on that line"——Obsidian 实际只展开光标所在元素,同行其余元素保持渲染。
  6. 后续 wikilinks 功能继承了这一意外行为(openspec/changes/add-wikilinks/proposal.md:11),使其看起来像既定政策。

为什么这个修复是好的

  • 恢复 PRD 规定行为,对齐 Obsidian 用户预期;
  • 不触碰治本机制:仅替换判定谓词(selectionOnSameLine → 元素包含判定),零宽 replace/mark 隐藏机制原样保留,9e2a5eb 修好的点击漂移不变;
  • 消除双击误跳转:不再有无预警的整行布局位移,点击落点始终精准;
  • 有先例:图片 widget 与 markdown [text](url) 链接在本项目中早已是元素级感知,本次只是让 wikilinks 与粗体/斜体/删除线/行内代码对齐。

受影响的范围

维度 范围
引入 提交 9e2a5eb(2026-04-17);v0.0.1、v0.0.3 及之后的多数发布标签均受影响,含当前 main
代码 packages/core/src/wikilinks.ts(reveal 判定)、packages/core/src/live-preview.ts 内联格式分支
受影响语法 [[wikilink]]、**bold**、*italic*、~~del~~、`inline code`
不受影响 [text](url) 链接与 autolink(已是元素级)、标题/表格/代码块/图片等块级元素
用户场景 行内编辑、双击选词(误跳转)、滚动后点击落点信心

复现环境:electron-demo,Live Preview 开启。修复分支:#260

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions