在保留选择的摩纳哥编辑器中插入行

Insert line in Monaco editor preserving selection

我想在给定行号处的现有文本之前插入一行文本。我目前正在使用这个:

const insertionRange = new monaco.Range(
    lineNo, this.getModel().getLineMinColumn(lineNo),
    lineNo, this.getModel().getLineMinColumn(lineNo),
);
this.executeEdits("", [{ range: insertionRange, text: insertMe + "\n" }]);

但是我想我还需要按下插入光标和我插入的文本后面的任何选择。所以如果之前我有:

1  So we beat on,
2  borne back ceaselessly into the past.|

在第 2 行之前插入一行后,我希望插入点在第 3 行的末尾:

1  So we beat on,
2  boats against the current,
3  borne back ceaselessly into the past.|

ICodeEditor.executeEdits 确实采用了可选的第三个 ICursorStateComputer 选项,可用于在编辑发生后修改光标,但我不确定如何使用它。

还有一个 InsertLineBeforeAction,我可以使用它来代替手动操作。

一个可能的选择是计算新的选择,可能是这样的:

const newSelections = this.getSelections().map((s) => {
    if (s.endLineNumber >= lineNo) s.endLineNumber ++;
    if (s.positionLineNumber >= lineNo) s.positionLineNumber ++;
    if (s.selectionStartLineNumber >= lineNo) s.selectionStartLineNumber ++;
    if (s.startLineNumber >= inputLineNum) s.startLineNumber ++;
    return s;
});

然后将 newSelections 作为第三个参数传递给 executeEdits