C7.17.3Undo spanning voice and keyboard设计研究
两种输入方式混用时,撤销操作需要覆盖两种来源产生的内容
别名: 跨通道撤销 · mixed undo · 听写撤销
概念解释
同一文本框里,有的字来自识别,有的来自键入。撤销必须能跨过这两种来源:撤销一次语音插入、再撤销一次键盘插入,或一次撤销整段语音假设,而不把另一种来源的编辑卡在无法回退的状态。混用若只给键盘撤销栈,语音写进去的大段会变成不可逆。
机制
键盘撤销通常按 IME 提交或按键分组。语音一次可能插入整句,应成为撤销栈上的一个(或按短语切分的几个)原子。两条通道若各维护自己的栈,或语音绕过控件直接改 attributed string,撤销会漏。正确模型是统一的文档历史:每条记录带来源标签,撤销/重做不关心当时是谁写的。部分结果抖动若每帧都入栈,撤销会变成“退回上一个闪烁”,必须先合并。来源标签还让“只撤语音、保留后来键盘改的字”成为可能,但这是高级行为;底线是两种来源都能被撤到。
怎么研究
脚本:语音插入一句、键盘改一个字、再语音追加、撤销三次。记录每次文档状态是否符合用户预期。比较系统文本框、Web contenteditable、自定义编辑器。数撤销步数与来源切换次数。不要只测纯键盘撤销。
边界
协作编辑的远程更改是第三种来源,不在这组里。有的听写把整段语音当成一次提交,粒度太粗;有的按词切,粒度太细。应用级“还原到上次保存”不是逐次撤销。崩溃后的恢复栈可能丢来源标签。
怎么落地
- 把每次终态语音插入和每次键盘提交写进同一撤销栈,语音以句或明显停顿为原子。
- 撤销按钮在混用后仍可用,不要在切通道时清空栈。
- 验收上述四步脚本,三种来源交错后仍能退回空字段或退到任意中间态。