光标
光标是一种可独立存储的实体,可以与 Loro 文档分离存放,用于稳定表示 Text、List、MovableList 等结构中的位置。它既可以表示协同光标,也可以用于高亮范围或评论范围。
背景
如果直接用“索引”表示光标位置,一旦文档被编辑,索引就会失效。更可靠的做法是利用 List CRDT 或 Text CRDT 中元素 / 字符的唯一 ID 来表示具体位置。
更新光标
Loro 的状态元数据不会保存已删除元素的 ID,这虽能节省空间,但会让基于 ID 的光标定位变得复杂。解决方案是:在需要时重放相关历史以更新稳定位置。同时,系统会尽量把光标更新为当前仍存在的元素 ID,从而降低未来重放的次数。
每个位置都带有 Side 信息,指示光标位于目标 ID 的左侧、右侧或正中。
注意:在 JavaScript 中,稳定位置返回的偏移量基于 UTF-16 索引。
示例
const = new ();
const = .("list");
.(0, "a");
const = .(0);
.(1, "b");
{
const = .(!);
(.).(0);
(.).(0);
(.).();
}
.(0, "c");
{
const = .(!);
(.).(1);
(.).(0);
(.).();
}
.(1, 1);
{
const = .(!);
(.).(1);
(.).(-1);
(.).();
}