C6.16.1Undo granularity by word or action设计研究
撤销粒度按词或按操作而非按字符
别名: 撤销粒度 · 按词撤销 · undo chunk
概念解释
文本里的撤销应当一次回退一个有意义的编辑动作:刚打的这个词、刚粘贴的这一段、刚删的这一句,而不是把一段连续输入拆成五十次按字符的回退。粒度太细,撤销变成昂贵的退格;粒度太粗,一次撤销会带走用户还想留的改动。合适的边界是用户以为“我刚做完的那一下”。
机制
人把连续击键感知成一次组块(一个词、一次粘贴),把停顿、空格、焦点移动感知成分界。撤销栈若按底层按键事件入栈,栈深会等于击键数,一次撤销只吐一个字母,专家快捷键的优势被次数吃掉。若把整次会话合成一项,撤销又等于清空。实用的切分看时间间隙和操作类型:连续字母合成“打词”,粘贴、剪切、全选删除各自成项,方向键移动通常不入栈。分界与工作记忆里的“上一步”对齐,用户才能预测按下去会掉什么。退格键是另一条栈:它删除文档里的字符,不一定弹出撤销栈的项;把退格和撤销混成同一手势,粒度模型会塌掉。
怎么研究
让人打一段话、中途粘贴、再改几个词,然后只许用撤销回到指定的中间态,记录按了多少次、是否过冲。自变量包括切分规则(按字符 / 按词 / 按停顿 / 按命令)、停顿阈值。因变量包括次数、过冲到不想删的内容、以及用户报告的“这是不是我上一步”。不要只用“能否回到最初”:那用按字符也能做到,只是慢。
边界
逐字符精确的编辑(改一个拼写错误里的一个字母)需要细粒度,此时按词撤销会过头,应能在词内再细。程序化的大批量替换是一项,即使用户感觉“改了很多处”。协作编辑里别人的动作不应进我的撤销栈。IME 组合缓冲未上屏时,撤销的对象是组合串,不是已上屏词,切分规则要另定。
怎么落地
- 把连续击键按停顿和空白切成词级项,把粘贴、剪切、替换各记为一项,避免按键级入栈。
- 让一次撤销的可见结果与“上一步”的口头描述一致;若用户说“我只想拿掉刚才那次粘贴”却连前面打的词也没了,切分过粗。
- 用“打三词—粘贴—再打两词—撤回到粘贴前”做验收,目标是一次或两次撤销,而不是按字符数。