diff --git a/src/ace/Document.js b/src/ace/Document.js index 0ed141f1..6bc91f7c 100644 --- a/src/ace/Document.js +++ b/src/ace/Document.js @@ -358,11 +358,11 @@ ace.Document = function(text, mode) { } else { var line = this.lines[position.row] || ""; + var firstLine = line.substring(0, position.column) + newLines[0]; + var lastLine = newLines[newLines.length - 1] + line.substring(position.column); - this.lines[position.row] = line.substring(0, position.column) - + newLines[0]; - this.lines[position.row + 1] = newLines[newLines.length - 1] - + line.substring(position.column); + this.lines[position.row] = firstLine; + this.$insertLines(position.row + 1, [lastLine]); if (newLines.length > 2) { this.$insertLines(position.row + 1, newLines.slice(1, -1)); diff --git a/src/ace/lib/lang.js b/src/ace/lib/lang.js index 40be4580..73ea7720 100644 --- a/src/ace/lib/lang.js +++ b/src/ace/lib/lang.js @@ -57,6 +57,11 @@ } }, + call: function() { + this.cancel(); + fcn(); + }, + cancel: function() { clearTimeout(timer); timer = null; diff --git a/src/test/DocumentTest.js b/src/test/DocumentTest.js index d1002ede..08067696 100644 --- a/src/test/DocumentTest.js +++ b/src/test/DocumentTest.js @@ -123,5 +123,27 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { end: {row: 2, column: 1} }, ["4", "5", "6"].join("\n")); assertEquals(["4", "5", "6"].join("\n"), doc.toString()); + }, + + "test: undo/redo for delete line" : function() { + var doc = new ace.Document(["111", "222", "333"]); + var undoManager = new ace.UndoManager(); + doc.setUndoManager(undoManager); + + var initialText = doc.toString(); + + var editor = new ace.Editor(new MockRenderer(), doc); + + editor.removeLines(); + var removedText = doc.toString(); + + // call normally async code now + doc.$informUndoManager.call(); + + undoManager.undo(); + assertEquals(initialText, doc.toString()); + + undoManager.redo(); + assertEquals(removedText, doc.toString()); } }); \ No newline at end of file