diff --git a/lib/ace/editor.js b/lib/ace/editor.js index d92666b8..b279ef7f 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -704,12 +704,14 @@ var Editor = function(renderer, session) { if (transform) text = transform.text; } - - text = text.replace("\t", this.session.getTabString()); + + if (text == "\t") + text = this.session.getTabString(); // remove selected text if (!this.selection.isEmpty()) { - cursor = this.session.remove(this.getSelectionRange()); + var range = this.getSelectionRange(); + cursor = this.session.remove(range); this.clearSelection(); } else if (this.session.getOverwrite()) { @@ -718,6 +720,13 @@ var Editor = function(renderer, session) { this.session.remove(range); } + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row) + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } this.clearSelection(); var start = cursor.column; @@ -740,44 +749,10 @@ var Editor = function(renderer, session) { } } - // TODO disabled multiline auto indent - // possibly doing the indent before inserting the text - // if (cursor.row !== end.row) { if (session.getDocument().isNewLine(text)) { var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); - this.moveCursorTo(cursor.row+1, 0); - - var size = session.getTabSize(); - var minIndent = Number.MAX_VALUE; - - for (var row = cursor.row + 1; row <= end.row; ++row) { - var indent = 0; - - line = session.getLine(row); - for (var i = 0; i < line.length; ++i) - if (line.charAt(i) == '\t') - indent += size; - else if (line.charAt(i) == ' ') - indent += 1; - else - break; - if (/[^\s]/.test(line)) - minIndent = Math.min(indent, minIndent); - } - - for (var row = cursor.row + 1; row <= end.row; ++row) { - var outdent = minIndent; - - line = session.getLine(row); - for (var i = 0; i < line.length && outdent > 0; ++i) - if (line.charAt(i) == '\t') - outdent -= size; - else if (line.charAt(i) == ' ') - outdent -= 1; - session.remove(new Range(row, 0, row, i)); - } - session.indentRows(cursor.row + 1, end.row, lineIndent); + session.insert({row: cursor.row+1, column: 0}, lineIndent); } if (shouldOutdent) mode.autoOutdent(lineState, session, cursor.row); @@ -1072,6 +1047,16 @@ var Editor = function(renderer, session) { var session = this.session; var state = session.getState(range.start.row); var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + + if (range.end.column == 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row) + if (/^\s+$/.test(line)) { + range.end.column = line.length + } + } + } if (new_range) range = new_range; } @@ -1209,23 +1194,37 @@ var Editor = function(renderer, session) { var session = this.session; var range = this.getSelectionRange(); - if (range.start.row < range.end.row || range.start.column < range.end.column) { + if (range.start.row < range.end.row) { var rows = this.$getSelectedRows(); session.indentRows(rows.first, rows.last, "\t"); - } else { - var indentString; - - if (this.session.getUseSoftTabs()) { - var size = session.getTabSize(), - position = this.getCursorPosition(), - column = session.documentToScreenColumn(position.row, position.column), - count = (size - column % size); - - indentString = lang.stringRepeat(" ", count); - } else - indentString = "\t"; - return this.insert(indentString); + return; + } else if (range.start.column < range.end.column) { + var text = session.getTextRange(range) + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } } + + var line = session.getLine(range.start.row) + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } else { + var count = column % size; + while (line[range.start.column] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); }; /** diff --git a/lib/ace/mode/behaviour/xml.js b/lib/ace/mode/behaviour/xml.js index 0d03b763..7a996e22 100644 --- a/lib/ace/mode/behaviour/xml.js +++ b/lib/ace/mode/behaviour/xml.js @@ -84,11 +84,11 @@ var XmlBehaviour = function () { this.add('autoindent', 'insertion', function (state, action, editor, session, text) { if (text == "\n") { var cursor = editor.getCursorPosition(); - var line = session.doc.getLine(cursor.row); + var line = session.getLine(cursor.row); var rightChars = line.substring(cursor.column, cursor.column + 2); if (rightChars == '