#8321·tiptap

ListKeymap Delete 可以跨越隔离的节点边界,并从不同的帧中加入内容

作者: Gamewise创建于 2026年9月7日更新于 2026年9月13日
标签status: triagearea: editorcomplexity: hardimpact: medium

受影响包

列表 Keymap

QQ 微调版本

3.30.5(但我相信所有版本)

QQ 浏览器已使用

颜色

发生了什么事?

ListKeymap 删除处理器会以孤立方式跨越祖先:在列表项末尾删除时为真。

我有一个自定义框架节点: { 内容 : “ block+” , 孤立:是的, } 和一页里面的多个相框兄弟姐妹。

鉴于这份文件: 页 次 QQ 框架( 孤立: 真) 命令列表 列表项目 QQ 段落("你好") QQ 段落 ("世界") │ QQ 框架( 孤立: 真) QQ 段落 ("whoops") Cursor在"你好"的结尾

按下删除 * 只应在第一个框架内操作, 因为框架已隔离: true 。 特别是,紧接清单之后的段落应该是相关的前行内容,在被按下删除时,它应产生一个有"你好世界"的列表项目;第二个框架绝不应被修改.

不过,在启用ListKeymap后,删除横跨隔离框架边界并生成: 框架 1 命令列表 QQ 列表项目 ("你好") QQ 段落( “ worldwhoops ” ) 第二帧被完全删除。

• 预期行为

隔离:真正的边界应防止删除操作从第一个框架跨入第二个框架。

对于正常的编辑行为,当Cursor处于最后列表项的结尾,并且在同一框中,列表后立即有一段,该段应当被合并入最后列表项,而不是从后来使用的框中的内容.

在绝对最少情况下,操作不应修改或去掉第二个帧.

QQ 可复制示例 URL (可选)

无回复( N)

附加上下文(可选)

我计划的重要部分就是: = 节点创建({ 名称:“框架”, 内容 : “ block+” , 孤立:是的, ) (中文(简体) ).

Const Page = 节点. create ({ 名称:“页”, 内容 : “ frame* ” , ● `

最小复制量

最小的概念文件是: 页 次 [隔离] 命令列表 列表项目 QQ 段落 ("A") QQ 段落 ("B") │ [隔离] QQ 第( C)段

按"删除"A结尾. ** 预期:** 框架1完好无损 框架2未受影响 B组合并为A组

** 实际:** 框2被删除 "C"被合并为"B"

问题似乎来自特定列表的“删除”路径。

ListKeymap 删除处理最终调用项目Forward () 。 该命令使用ProseMirror的 jointPoint () 来寻找祖先等级中的接合点 。

重要的问题是,这种祖先搜索似乎并没有像ProseMirror的正常结构删除命令那样将NodeSpec.隔离作为一个边界.

相反,ProseMiror的孤立文件说:

“这种类型的节点的侧面算作正常编辑操作,如回放或起放不会跨越的边界。”

内容来源: ueberdosis/tiptap