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;
}
});
