javascript - Editor Monaco: Actualizează poziția cursorului la inserarea textului
Adaug niște text în editorul Monaco folosind un buton din afara acestuia (adică „hello world”) și apoi încerc să setez poziția cursorului pe următoarea linie.
Am încercat să folosesc funcția „setPosition({column:x, lineNumber:y})” din editor, dar nu funcționează.
Așa este cum îl implementez:
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);
}
Mă aștept să văd cursorul la linia și coloana definite de cursorPosition, dar de fapt văd că cursorul indică linia 1 și coloana 1 (în partea de sus a editorului).
Am încercat, de asemenea, să folosesc aceeași API editor.setPosition() în interiorul metodei onDidChangeModelContent(), dar nu funcționează. Și când fac un print în consolă al editor.getPosition() primesc pozițiile corecte.
Ai vreo idee ce ar putea fi în neregulă?
Răspuns #1
this.editor?.trigger('keyboard', 'type', {text: 'value'});
this.editor?.focus();
const position: any = this.editor?.getPosition();
this.editor?.setPosition(position);
Răspunsul #2
Unele evenimente din editorul Monaco (inclusiv onDidChangeModelContent()) schimbă poziția cursorului după executare. Am preluat aceste informații de aici.
Pentru a preveni să se întâmple, poți face ceva de genul acesta:
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;
}
});
