|
@@ -106,7 +106,7 @@ class CodeMirrorEditor implements CodeEditor.IEditor {
|
|
|
}
|
|
|
});
|
|
|
CodeMirror.on(editor, 'cursorActivity', () => this._onCursorActivity());
|
|
|
- CodeMirror.on(editor.getDoc(), 'change', (instance, change) => {
|
|
|
+ CodeMirror.on(editor.getDoc(), 'beforeChange', (instance, change) => {
|
|
|
this._onDocChanged(instance, change);
|
|
|
});
|
|
|
}
|
|
@@ -603,7 +603,23 @@ class CodeMirrorEditor implements CodeEditor.IEditor {
|
|
|
return;
|
|
|
}
|
|
|
this._changeGuard = true;
|
|
|
- this.doc.setValue(this._model.value.text);
|
|
|
+ let doc = this.doc;
|
|
|
+ switch (args.type) {
|
|
|
+ case 'insert':
|
|
|
+ let pos = doc.posFromIndex(args.start);
|
|
|
+ doc.replaceRange(args.value, pos, pos);
|
|
|
+ break;
|
|
|
+ case 'remove':
|
|
|
+ let from = doc.posFromIndex(args.start);
|
|
|
+ let to = doc.posFromIndex(args.end);
|
|
|
+ doc.replaceRange('', from, to);
|
|
|
+ break;
|
|
|
+ case 'set':
|
|
|
+ doc.setValue(args.value);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
this._changeGuard = false;
|
|
|
}
|
|
|
|
|
@@ -615,7 +631,17 @@ class CodeMirrorEditor implements CodeEditor.IEditor {
|
|
|
return;
|
|
|
}
|
|
|
this._changeGuard = true;
|
|
|
- this._model.value.text = this.doc.getValue();
|
|
|
+ let value = this._model.value;
|
|
|
+ let start = doc.indexFromPos(change.from);
|
|
|
+ let end = doc.indexFromPos(change.to);
|
|
|
+ let inserted = change.text.join('\n');
|
|
|
+
|
|
|
+ if (end !== start) {
|
|
|
+ value.remove(start, end);
|
|
|
+ }
|
|
|
+ if (inserted) {
|
|
|
+ value.insert(start, inserted);
|
|
|
+ }
|
|
|
this._changeGuard = false;
|
|
|
}
|
|
|
|