首页
/ Milkdown输入规则撤销机制的问题与修复

Milkdown输入规则撤销机制的问题与修复

2025-05-24 14:11:31作者:戚魁泉Nursing

在Milkdown编辑器的输入规则(Input Rules)功能中,存在一个关于撤销(undo)行为的bug。这个bug会导致编辑器忽略开发者设置的undoable选项,使得即使明确禁用了撤销功能,输入规则依然可以被撤销。

问题背景

输入规则是编辑器中的一项重要功能,它允许开发者为特定的文本模式定义自动转换规则。例如,用户输入"> "时自动转换为块引用,或者输入"1. "时自动创建有序列表。在Milkdown中,这些输入规则可以通过inputRules插件来配置。

每个输入规则都可以配置一个undoable选项,这个选项决定了当用户触发输入规则后,是否可以通过按退格键(Backspace)来撤销这次转换。默认情况下,这个选项是启用的,但开发者可以显式地将其设置为false来禁用这一行为。

问题分析

问题的根源在于Milkdown对输入规则的处理逻辑与上游的prosemirror-inputrules存在差异。具体来说:

  1. 在prosemirror-inputrules的实现中,会检查rule.undoable选项,只有当其为真时才会设置相关的撤销元数据
  2. 而Milkdown的实现中缺少了这一检查,导致无论undoable如何设置,都会记录撤销信息

这种差异使得undoable: false的配置实际上没有生效,用户仍然可以通过退格键撤销输入规则的转换。

解决方案

修复方案相对简单直接:在设置撤销元数据前,先检查rule.undoable选项。只有当该选项为真时,才记录撤销信息。具体代码修改如下:

if (rule.undoable) {
  tr.setMeta(plugin, { transform: tr, from, to, text })
}
view.dispatch(tr)

这一修改保持了与上游库一致的行为逻辑,同时确保了undoable配置能够按预期工作。

影响范围

这个bug只会影响到那些显式设置了undoable: false的用户。对于大多数使用默认配置或不需要禁用撤销功能的用户来说,不会产生任何影响。

最佳实践

对于开发者来说,在使用输入规则时应当注意:

  1. 明确是否需要撤销功能 - 对于某些关键转换,可能需要禁用撤销
  2. 测试撤销行为 - 确保配置按预期工作
  3. 关注版本更新 - 及时获取修复后的版本

这个修复体现了Milkdown团队对API一致性和开发者体验的重视,确保了配置选项能够真正影响编辑器的行为。

登录后查看全文
热门项目推荐
相关项目推荐