现象 / Actual behavior
Live Preview 模式下,光标进入任意一行 (哪怕点在该行的空白处、或某个样式元素旁边的普通文字上),该行所有 内联 Markdown 语法都会同时从渲染态翻转为源码态:
[[wikilink]] 全部展开为原始双括号语法
**粗体**、*斜体*、~~删除线~~、`行内代码` 的标记全部显现
更严重的连带问题:双击选中链接周边单词时会误跳转到其他页面 。因为光标落点触发了整行展开,布局发生位移,双击的第二次点击落在被展开的 wikilink 命中区上,直接触发 onNavigate 跳转——用户只是想选个词,却被带离了当前笔记。
复现步骤
新建笔记输入:前言 [[目标页]] 中间 **加粗** 尾巴 \代码``
光标点击"前言"二字 → 整行全部展开为源码(预期:什么都不发生)
在 [[目标页]] 旁边的"中间"二字上双击选词 → 因整行展开导致布局位移,点击命中 wikilink → 直接跳转到"目标页"
GIF-1 · 参照行为:Obsidian
GIF-2 · 本项目现状
期望 / Expected behavior
与 Obsidian Live Preview 一致的元素级展开 :只有光标严格所在的那一个内联元素显示原始语法;点击相邻空格或同行其他位置不展开任何东西;其他元素保持渲染态。
为什么这是 Bug 而不是特性
基于仓库历史事实(可复核):
产品需求文档规定的是元素级 。prd.md:96(§4.1 实时预览机制):「当光标不在某个特定的 Markdown 结构(如 **加粗** 或 )内部时,将其折叠并替换为一个 Widget;当光标移入 时,展开为源码供编辑。」——判定粒度是"结构(元素)",从未提及"行"。
最早的实现正是元素级 。提交 9e2a5eb(2026-04-17)的信息自证其修复前状态:按元素区间逐个判断(selectionIntersects)。
当年缺陷的根因是隐藏手段,不是粒度 。同一条提交信息写明:scroll click desync 由 color:transparent / font-size:0 这类"字符仍占位但不可见"的隐藏方式引起 CM6 坐标映射错位。
粒度改整行是被捆绑进来的越界变更 。该提交在换用零宽 Decoration.replace(真正的治本修复)的同时,顺手把判定从元素级改成行级;diff 注释把 desync 归因于"transparent marks"——即变更 Feat/shaoyongqiang demo #1 ,而非元素级判定本身。没有任何需求/Issue/设计文档要求行级行为。
行级化的唯一辩护理由是错误的 。提交信息称 "This matches Obsidian's approach: clicking anywhere on a line reveals all formatting markers on that line"——Obsidian 实际只展开光标所在元素,同行其余元素保持渲染。
后续 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
现象 / Actual behavior
Live Preview 模式下,光标进入任意一行(哪怕点在该行的空白处、或某个样式元素旁边的普通文字上),该行所有内联 Markdown 语法都会同时从渲染态翻转为源码态:
[[wikilink]]全部展开为原始双括号语法**粗体**、*斜体*、~~删除线~~、`行内代码`的标记全部显现更严重的连带问题:双击选中链接周边单词时会误跳转到其他页面。因为光标落点触发了整行展开,布局发生位移,双击的第二次点击落在被展开的 wikilink 命中区上,直接触发
onNavigate跳转——用户只是想选个词,却被带离了当前笔记。复现步骤
前言 [[目标页]] 中间 **加粗** 尾巴 \代码``[[目标页]]旁边的"中间"二字上双击选词 → 因整行展开导致布局位移,点击命中 wikilink → 直接跳转到"目标页"GIF-1 · 参照行为:Obsidian
GIF-2 · 本项目现状
期望 / Expected behavior
与 Obsidian Live Preview 一致的元素级展开:只有光标严格所在的那一个内联元素显示原始语法;点击相邻空格或同行其他位置不展开任何东西;其他元素保持渲染态。
为什么这是 Bug 而不是特性
基于仓库历史事实(可复核):
prd.md:96(§4.1 实时预览机制):「当光标不在某个特定的 Markdown 结构(如**加粗**或)内部时,将其折叠并替换为一个 Widget;当光标移入时,展开为源码供编辑。」——判定粒度是"结构(元素)",从未提及"行"。9e2a5eb(2026-04-17)的信息自证其修复前状态:按元素区间逐个判断(selectionIntersects)。color:transparent/font-size:0这类"字符仍占位但不可见"的隐藏方式引起 CM6 坐标映射错位。Decoration.replace(真正的治本修复)的同时,顺手把判定从元素级改成行级;diff 注释把 desync 归因于"transparent marks"——即变更 Feat/shaoyongqiang demo #1,而非元素级判定本身。没有任何需求/Issue/设计文档要求行级行为。openspec/changes/add-wikilinks/proposal.md:11),使其看起来像既定政策。为什么这个修复是好的
selectionOnSameLine→ 元素包含判定),零宽 replace/mark 隐藏机制原样保留,9e2a5eb 修好的点击漂移不变;[text](url)链接在本项目中早已是元素级感知,本次只是让 wikilinks 与粗体/斜体/删除线/行内代码对齐。受影响的范围
9e2a5eb(2026-04-17);v0.0.1、v0.0.3 及之后的多数发布标签均受影响,含当前 mainpackages/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