fix move lines with multiple cursors
This commit is contained in:
parent
917420636b
commit
f6d88bc10c
4 changed files with 159 additions and 144 deletions
|
|
@ -359,23 +359,19 @@ exports.commands = [{
|
|||
}, {
|
||||
name: "copylinesup",
|
||||
bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
|
||||
exec: function(editor) { editor.copyLinesUp(); },
|
||||
multiSelectAction: "forEachLine"
|
||||
exec: function(editor) { editor.copyLinesUp(); }
|
||||
}, {
|
||||
name: "movelinesup",
|
||||
bindKey: bindKey("Alt-Up", "Option-Up"),
|
||||
exec: function(editor) { editor.moveLinesUp(); },
|
||||
multiSelectAction: "forEachLine"
|
||||
exec: function(editor) { editor.moveLinesUp(); }
|
||||
}, {
|
||||
name: "copylinesdown",
|
||||
bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
|
||||
exec: function(editor) { editor.copyLinesDown(); },
|
||||
multiSelectAction: "forEachLine"
|
||||
exec: function(editor) { editor.copyLinesDown(); }
|
||||
}, {
|
||||
name: "movelinesdown",
|
||||
bindKey: bindKey("Alt-Down", "Option-Down"),
|
||||
exec: function(editor) { editor.moveLinesDown(); },
|
||||
multiSelectAction: "forEachLine"
|
||||
exec: function(editor) { editor.moveLinesDown(); }
|
||||
}, {
|
||||
name: "del",
|
||||
bindKey: bindKey("Delete", "Delete|Ctrl-D"),
|
||||
|
|
|
|||
|
|
@ -1367,8 +1367,7 @@ var Editor = function(renderer, session) {
|
|||
var row = range.start.row;
|
||||
doc.duplicateLines(row, row);
|
||||
} else {
|
||||
var reverse = sel.isBackwards()
|
||||
var point = sel.isBackwards() ? range.start : range.end;
|
||||
var point = reverse ? range.start : range.end;
|
||||
var endPoint = doc.insert(point, doc.getTextRange(range), false);
|
||||
range.start = point;
|
||||
range.end = endPoint;
|
||||
|
|
@ -1412,9 +1411,6 @@ var Editor = function(renderer, session) {
|
|||
* @related EditSession.moveText
|
||||
**/
|
||||
this.moveText = function(range, toPosition) {
|
||||
if (this.$readOnly)
|
||||
return null;
|
||||
|
||||
return this.session.moveText(range, toPosition);
|
||||
};
|
||||
|
||||
|
|
@ -1450,25 +1446,39 @@ var Editor = function(renderer, session) {
|
|||
*
|
||||
**/
|
||||
this.$moveLines = function(mover) {
|
||||
var rows = this.$getSelectedRows();
|
||||
var selection = this.selection;
|
||||
if (!selection.isMultiLine()) {
|
||||
var range = selection.getRange();
|
||||
var reverse = selection.isBackwards();
|
||||
}
|
||||
if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {
|
||||
var range = selection.toOrientedRange();
|
||||
var rows = this.$getSelectedRows(range);
|
||||
var linesMoved = mover.call(this, rows.first, rows.last);
|
||||
range.moveBy(linesMoved, 0);
|
||||
selection.fromOrientedRange(range);
|
||||
} else {
|
||||
var ranges = selection.rangeList.ranges;
|
||||
selection.rangeList.detach(this.session);
|
||||
|
||||
var linesMoved = mover.call(this, rows.first, rows.last);
|
||||
for (var i = ranges.length; i--; ) {
|
||||
var rangeIndex = i;
|
||||
var rows = ranges[i].collapseRows();
|
||||
var last = rows.end.row;
|
||||
var first = rows.start.row;
|
||||
while (i--) {
|
||||
var rows = ranges[i].collapseRows();
|
||||
if (first - rows.end.row <= 1)
|
||||
first = rows.end.row;
|
||||
else
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
|
||||
if (range) {
|
||||
range.start.row += linesMoved;
|
||||
range.end.row += linesMoved;
|
||||
selection.setSelectionRange(range, reverse);
|
||||
}
|
||||
else {
|
||||
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
|
||||
selection.$moveSelection(function() {
|
||||
selection.moveCursorTo(rows.first+linesMoved, 0);
|
||||
});
|
||||
var linesMoved = mover.call(this, first, last);
|
||||
while (rangeIndex >= i) {
|
||||
ranges[rangeIndex].moveBy(linesMoved, 0);
|
||||
rangeIndex--;
|
||||
}
|
||||
}
|
||||
selection.fromOrientedRange(selection.ranges[0]);
|
||||
selection.rangeList.attach(this.session);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -482,7 +482,7 @@ var Editor = require("./editor").Editor;
|
|||
this.inVirtualSelectionMode = true;
|
||||
for (var i = rangeList.ranges.length; i--;) {
|
||||
if ($byLines) {
|
||||
while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i].end.row)
|
||||
while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row)
|
||||
i--;
|
||||
}
|
||||
tmpSel.fromOrientedRange(rangeList.ranges[i]);
|
||||
|
|
|
|||
|
|
@ -517,6 +517,15 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
|
|||
);
|
||||
};
|
||||
|
||||
|
||||
/* experimental */
|
||||
this.moveBy = function(row, column) {
|
||||
this.start.row += row;
|
||||
this.start.column += column;
|
||||
this.end.row += row;
|
||||
this.end.column += column;
|
||||
};
|
||||
|
||||
}).call(Range.prototype);
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue