浏览代码

Merge pull request #2035 from ian-r-rose/codemirror_text_diffs

Reintroduce diffing on strings for the CodeMirror editor.
Steven Silvester 8 年之前
父节点
当前提交
25c4ad27ee
共有 1 个文件被更改,包括 29 次插入3 次删除
  1. 29 3
      packages/codemirror/src/editor.ts

+ 29 - 3
packages/codemirror/src/editor.ts

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