Merge pull request #1512 from ajaxorg/indent
fix #549 enter on start of indented line should keep indentation
This commit is contained in:
commit
6783f921c9
2 changed files with 54 additions and 55 deletions
|
|
@ -705,11 +705,13 @@ var Editor = function(renderer, session) {
|
||||||
text = transform.text;
|
text = transform.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
text = text.replace("\t", this.session.getTabString());
|
if (text == "\t")
|
||||||
|
text = this.session.getTabString();
|
||||||
|
|
||||||
// remove selected text
|
// remove selected text
|
||||||
if (!this.selection.isEmpty()) {
|
if (!this.selection.isEmpty()) {
|
||||||
cursor = this.session.remove(this.getSelectionRange());
|
var range = this.getSelectionRange();
|
||||||
|
cursor = this.session.remove(range);
|
||||||
this.clearSelection();
|
this.clearSelection();
|
||||||
}
|
}
|
||||||
else if (this.session.getOverwrite()) {
|
else if (this.session.getOverwrite()) {
|
||||||
|
|
@ -718,6 +720,13 @@ var Editor = function(renderer, session) {
|
||||||
this.session.remove(range);
|
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();
|
this.clearSelection();
|
||||||
|
|
||||||
var start = cursor.column;
|
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)) {
|
if (session.getDocument().isNewLine(text)) {
|
||||||
var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());
|
var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());
|
||||||
|
|
||||||
this.moveCursorTo(cursor.row+1, 0);
|
session.insert({row: cursor.row+1, column: 0}, lineIndent);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
if (shouldOutdent)
|
if (shouldOutdent)
|
||||||
mode.autoOutdent(lineState, session, cursor.row);
|
mode.autoOutdent(lineState, session, cursor.row);
|
||||||
|
|
@ -1072,6 +1047,16 @@ var Editor = function(renderer, session) {
|
||||||
var session = this.session;
|
var session = this.session;
|
||||||
var state = session.getState(range.start.row);
|
var state = session.getState(range.start.row);
|
||||||
var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);
|
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)
|
if (new_range)
|
||||||
range = new_range;
|
range = new_range;
|
||||||
}
|
}
|
||||||
|
|
@ -1209,23 +1194,37 @@ var Editor = function(renderer, session) {
|
||||||
var session = this.session;
|
var session = this.session;
|
||||||
var range = this.getSelectionRange();
|
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();
|
var rows = this.$getSelectedRows();
|
||||||
session.indentRows(rows.first, rows.last, "\t");
|
session.indentRows(rows.first, rows.last, "\t");
|
||||||
} else {
|
return;
|
||||||
var indentString;
|
} else if (range.start.column < range.end.column) {
|
||||||
|
var text = session.getTextRange(range)
|
||||||
if (this.session.getUseSoftTabs()) {
|
if (!/^\s+$/.test(text)) {
|
||||||
var size = session.getTabSize(),
|
var rows = this.$getSelectedRows();
|
||||||
position = this.getCursorPosition(),
|
session.indentRows(rows.first, rows.last, "\t");
|
||||||
column = session.documentToScreenColumn(position.row, position.column),
|
return;
|
||||||
count = (size - column % size);
|
}
|
||||||
|
|
||||||
indentString = lang.stringRepeat(" ", count);
|
|
||||||
} else
|
|
||||||
indentString = "\t";
|
|
||||||
return this.insert(indentString);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -84,11 +84,11 @@ var XmlBehaviour = function () {
|
||||||
this.add('autoindent', 'insertion', function (state, action, editor, session, text) {
|
this.add('autoindent', 'insertion', function (state, action, editor, session, text) {
|
||||||
if (text == "\n") {
|
if (text == "\n") {
|
||||||
var cursor = editor.getCursorPosition();
|
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);
|
var rightChars = line.substring(cursor.column, cursor.column + 2);
|
||||||
if (rightChars == '</') {
|
if (rightChars == '</') {
|
||||||
var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();
|
var next_indent = this.$getIndent(line);
|
||||||
var next_indent = this.$getIndent(session.doc.getLine(cursor.row));
|
var indent = next_indent + session.getTabString();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
text: '\n' + indent + '\n' + next_indent,
|
text: '\n' + indent + '\n' + next_indent,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue