CodeMirror API 光标和选区操作

CodeMirror API 光标和选区操作包含编辑器设置,获取,光标位置;获取光标处”词”,选区设置,获取等。

doc.getSelection(?lineSep: string) → string
获取编辑器内当前选中的内容。可选参数lineSep传入一个放到输出内容中行间的行分隔符。如果有多个选区,那么会将这些选区合并,选区间使用lineSep指定的行分隔符分隔。

doc.getSelections(?lineSep: string) → string
获取包含每个选区内容(字符串)的数组。

doc.replaceSelection(replacement: string, ?select: string)
使用给定字符串替换(一个或多个)选区内容。默认情况下,新的选区是在插入的文本后结束(我的测试是直接就消失了)。可选的select参数用来改变此默认处理————传入“around”会让新文本被选中,而传入start会收缩选择区到插入文本的开始处。

doc.replaceSelections(replacements: array, ?select: string)
给定的数组长度应该和选区数量相同,给定的每项替换对应的选区内容。select用法和replaceSelection相同。

doc.getCursor(?start: string) → {line, ch}
没有选区或不传参数时,返回当前光标位置。否则,返回主选区的结束位置。
英文文档写了很长,但是这个实在没怎么理解。然后就自己测试了一下:
参数可以传 start end from to head anchor,测试来看,start、from、anchor 结果,都是选区的开始位置;end、to、head结果,都是选区的结束位置。其中,anchorhead有所不同,anchor是鼠标选择时的开始位置,head是鼠标选择时的结束位置。比如鼠标是从一行右边往左边选择的,那么anchor会返回右边的位置,head会返回左边的位置。

doc.listSelections() → array<{anchor, head}>
返回所有的选区列表,列表包含 anchor(选区开始位置)和head(选区结束位置)。

doc.somethingSelected() → boolean
在有文本被选中的时候返回true

doc.setCursor(pos: {line, ch}|number, ?ch: number, ?options: object)
设置光标位置。可以传参数 {line, ch}对象,也可以将这两个值作为两个参数传入。此操作会移除所有选区(只是选区,不是内容),然后在指定光标处创建一个空的选区。 参数optionssetSelection的参数。

doc.setSelection(anchor: {line, ch}, ?head: {line, ch}, ?options: object)
设置一个选区。anchorhead{line, ch}对象。当没有指定head时,默认为anchor指定的值。可选参数options是一个对象,支持以下选项:
scroll: boolean
是否要将选区的的head位置滚动到可视区域,默认为true。

origin: string
是否要将选区的历史事件与前一个合并。blabla.. i can not understand any more.
Detemines whether the selection history event may be merged with the previous one. When an origin starts with the character +, and the last recorded selection had the same origin and was similar (close in time, both collapsed or both non-collapsed), the new one will replace the old one. When it starts with *, it will always replace the previous event (if that had the same origin). Built-in motion uses the “+move” origin. User input uses the “+input” origin.

bias: number
Determine the direction into which the selection endpoints should be adjusted when they fall inside an atomic range. Can be either -1 (backward) or 1 (forward). When not given, the bias will be based on the relative position of the old selection—the editor will try to move further away from that, to prevent getting stuck.

doc.setSelections(ranges: array<{anchor, head}>, ?primary: integer, ?options: object)
设置一组新选区。数组中至少需要包含一个选区。当primary为数字时,表示着那一个选区为主选区。

doc.addSelection(anchor: {line, ch}, ?head: {line, ch})
添加一个选区并设置为主选区。

doc.extendSelection(from: {line, ch}, ?to: {line, ch}, ?options: object)
setSelection类似。区别在于,当按下shift键或设置了extending标志时(指的是设置为true),只会移动head的位置,anchor会被留在当前位置。参数to是可选的,传此参数用于确保区域(region,比如单词或段落)能被完整选择。当前有多个选区时,会清除掉主选区。参数optionssetSelection

doc.extendSelections(heads: array<{line, ch}>, ?options: object)
extendSelection,一次作用到所有选区。

doc.extendSelectionsBy(f: function(range: {anchor, head}) → {line, ch}), ?options: object)
将指定的函数应用到所有选区上,然后在结果上调用extendSelections

doc.setExtending(value: boolean)
设置或清除‘extending’ 标志,此标志作用类似shift键。此函数会引发光标移动,并调用 extendSelection 函数。

doc.getExtending() → boolean
获取extending标志的值。

cm.hasFocus() → boolean
当前编辑器是否获得了焦点。

cm.findPosH(start: {line, ch}, amount: integer, unit: string, visually: boolean) → {line, ch, ?hitSide: boolean}
用于查找光标水平移动的位置。start是一个{line, ch}对象,amount是数字(可以是负数),unitchar, column, word中的一个。返回移动unit指定的距离amount次。当visually为true时,从右到左的运动是可视的,而不是逻辑的。如果运动到达文档的开始或结束位置,那么返回值中会包含为true的hitSide 属性。

cm.findPosV(start: {line, ch}, amount: integer, unit: string) → {line, ch, ?hitSide: boolean}
类似findPosH,但是是用于垂直运动。unit可以是linepage

cm.findWordAt(pos: {line, ch}) → {anchor: {line, ch}, head: {line, ch}}
返回指定位置的”词”(字符,空白或标点符号)的开始和结束位置。