Skip to content

案例:选择

编辑器的状态总会保存至少一个选择区间。当多选择开启时,也许会有多个选择区间。

区间包含一个锚(按住 shift 时不会移动的一边)和一个头(会移动的一边)。当锚和头相同时,叫做游标选择,其他则叫是一个选择区间。

当有多个选择区间时,其中一个被认为是主区间(也是原生选择反映的那一个)。如果你有一个编辑器状态,可以通过 state.selection.main 访问主区间。SelectionRange 对象用于保持文档位置,包含 anchor 和 head 属性(如果您对最小或最大侧感兴趣,还添加 from/to)。

和其他编辑器状态修改的方式一样,通过调用事务移动选择。例如下方:移动游标到文档起始位置:

javascript
view.dispatch({ selection: { anchor: 0 } })

事务规范的选择属性接受简写对象 { anchor: number, head?: number }和完整 EditorSelection 的实例其中一个。

下面代码创建两个选择范围,选中了编辑器中第 4 个和第 6 个字符,以及位置为 8 的游标选择。使用的方式是第二种。

javascript
view.dispatch({
  selection: EditorSelection.create([
    EditorSelection.range(4, 5),
    EditorSelection.range(6, 7),
    EditorSelection.cursor(8)
  ], 1)
})

如果在事务改变文档的同时设置选择,选择应该指向修改后的文档。例如,下面展示再插入一个星号在位置 10 后设置游标在星号的后面。

javascript
view.dispatch({
  changes: {from: 10, insert: "*"},
  selection: {anchor: 11}
})

如果想要写一个指令来控制选择,您得稍微注意下多选择的情况。replaceSeletion(替换所有选择区间为相同文本) 和 changeByRange(允许您指定每个范围的更改,并将它们合并到单个事务规范中) 这种辅助方法会很有帮助的。

Last updated: