光标

光标是一种可独立存储的实体,可以与 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);
  (.).();
}