diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index ce959e57..e9e2a66a 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -93,6 +93,7 @@ var EditSession = function(text, mode) { this.setValue = function(text) { this.doc.setValue(text); + this.$deltas = []; }; this.getValue = @@ -479,36 +480,41 @@ var EditSession = function(text, mode) { }; this.undoChanges = function(deltas) { - this.selection.clearSelection(); + if (!deltas.length) + return; + this.$fromUndo = true; - for (var i=deltas.length-1; i>=0; i--) { - var delta = deltas[i]; - if (delta.action == "insertText") { - this.remove(delta.range, true); - this.selection.moveCursorToPosition(delta.range.start); - } else { - this.insert(delta.range.start, delta.text, true); - this.selection.clearSelection(); - } - } + this.doc.revertDeltas(deltas); this.$fromUndo = false; + + // update the selection + var firstDelta = deltas[0]; + var lastDelta = deltas[deltas.length-1]; + + this.selection.clearSelection(); + if (firstDelta.action == "insertText" || firstDelta.action == "insertLines") + this.selection.moveCursorToPosition(firstDelta.range.start); + if (firstDelta.action == "removeText" || firstDelta.action == "removeLines") + this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end)); }, this.redoChanges = function(deltas) { - this.selection.clearSelection(); - + if (!deltas.length) + return; + this.$fromUndo = true; - for (var i=0; i