javascript - Monaco Editor: Uppdatera markörposition när text infogas


Jag lägger till lite text i Monaco-redigeraren med en knapp utanför den (dvs "hello world") och försöker sedan sätta markörens position på nästa rad.

Jag försökte använda funktionen "setPosition({column:x, lineNumber:y})" från editorn, men den fungerar inte.

Så här implementerar jag det:

insertInPosition(textToInsert:string, cursorPosition:any){
    this.editorInstance.setPosition(cursorPosition);
    var allInstructions = this.instructionSet.split("\n")
    allInstructions.splice(cursorPosition.lineNumber - 1, 0, textToInsert);
    allInstructions.splice(cursorPosition.lineNumber, 1);
    allInstructions = allInstructions.join("\n");
    this.editorInstance.setPosition(cursorPosition);
}

Jag förväntar mig att se markören på den rad och kolumn som definieras av cursorPosition, men jag ser faktiskt att markören pekar på rad 1 och kolumn 1 (överst i editorn).

Jag försökte också använda samma API editor.setPosition() inuti onDidChangeModelContent()-metoden, men det fungerar inte. Och när jag skriver ut i konsolen editor.getPosition() får jag de korrekta positionerna.

Någon idé om vad som kan vara fel?

Svar #1

this.editor?.trigger('keyboard', 'type', {text: 'value'});
this.editor?.focus();
const position: any  = this.editor?.getPosition();
this.editor?.setPosition(position);

Svar #2

Vissa Monaco-editor-händelser (inklusive onDidChangeModelContent()) ändrar markörpositionen efter att ha körts. Jag tog denna information härifrån.

För att förhindra att det händer kan du göra något liknande detta:

var overridenPosition = null;

editor.onDidChangeModelContent(e => {
    if (/* your condition here */) {
        // your logic here
        overridenPosition = { lineNumber: 4, column: 2 }; // put your value here
    }
});

editor.onDidChangeCursorPosition(e => {
    if (overridenPosition != null) {
        editor.setPosition(overridenPosition);
        overridenPosition = null;
    }
});

Relaterade artiklar