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",
|
name: "copylinesup",
|
||||||
bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
|
bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
|
||||||
exec: function(editor) { editor.copyLinesUp(); },
|
exec: function(editor) { editor.copyLinesUp(); }
|
||||||
multiSelectAction: "forEachLine"
|
|
||||||
}, {
|
}, {
|
||||||
name: "movelinesup",
|
name: "movelinesup",
|
||||||
bindKey: bindKey("Alt-Up", "Option-Up"),
|
bindKey: bindKey("Alt-Up", "Option-Up"),
|
||||||
exec: function(editor) { editor.moveLinesUp(); },
|
exec: function(editor) { editor.moveLinesUp(); }
|
||||||
multiSelectAction: "forEachLine"
|
|
||||||
}, {
|
}, {
|
||||||
name: "copylinesdown",
|
name: "copylinesdown",
|
||||||
bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
|
bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
|
||||||
exec: function(editor) { editor.copyLinesDown(); },
|
exec: function(editor) { editor.copyLinesDown(); }
|
||||||
multiSelectAction: "forEachLine"
|
|
||||||
}, {
|
}, {
|
||||||
name: "movelinesdown",
|
name: "movelinesdown",
|
||||||
bindKey: bindKey("Alt-Down", "Option-Down"),
|
bindKey: bindKey("Alt-Down", "Option-Down"),
|
||||||
exec: function(editor) { editor.moveLinesDown(); },
|
exec: function(editor) { editor.moveLinesDown(); }
|
||||||
multiSelectAction: "forEachLine"
|
|
||||||
}, {
|
}, {
|
||||||
name: "del",
|
name: "del",
|
||||||
bindKey: bindKey("Delete", "Delete|Ctrl-D"),
|
bindKey: bindKey("Delete", "Delete|Ctrl-D"),
|
||||||
|
|
|
||||||
|
|
@ -1367,8 +1367,7 @@ var Editor = function(renderer, session) {
|
||||||
var row = range.start.row;
|
var row = range.start.row;
|
||||||
doc.duplicateLines(row, row);
|
doc.duplicateLines(row, row);
|
||||||
} else {
|
} else {
|
||||||
var reverse = sel.isBackwards()
|
var point = reverse ? range.start : range.end;
|
||||||
var point = sel.isBackwards() ? range.start : range.end;
|
|
||||||
var endPoint = doc.insert(point, doc.getTextRange(range), false);
|
var endPoint = doc.insert(point, doc.getTextRange(range), false);
|
||||||
range.start = point;
|
range.start = point;
|
||||||
range.end = endPoint;
|
range.end = endPoint;
|
||||||
|
|
@ -1412,9 +1411,6 @@ var Editor = function(renderer, session) {
|
||||||
* @related EditSession.moveText
|
* @related EditSession.moveText
|
||||||
**/
|
**/
|
||||||
this.moveText = function(range, toPosition) {
|
this.moveText = function(range, toPosition) {
|
||||||
if (this.$readOnly)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return this.session.moveText(range, toPosition);
|
return this.session.moveText(range, toPosition);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1450,25 +1446,39 @@ var Editor = function(renderer, session) {
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
this.$moveLines = function(mover) {
|
this.$moveLines = function(mover) {
|
||||||
var rows = this.$getSelectedRows();
|
|
||||||
var selection = this.selection;
|
var selection = this.selection;
|
||||||
if (!selection.isMultiLine()) {
|
if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {
|
||||||
var range = selection.getRange();
|
var range = selection.toOrientedRange();
|
||||||
var reverse = selection.isBackwards();
|
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) {
|
var linesMoved = mover.call(this, first, last);
|
||||||
range.start.row += linesMoved;
|
while (rangeIndex >= i) {
|
||||||
range.end.row += linesMoved;
|
ranges[rangeIndex].moveBy(linesMoved, 0);
|
||||||
selection.setSelectionRange(range, reverse);
|
rangeIndex--;
|
||||||
}
|
}
|
||||||
else {
|
}
|
||||||
selection.setSelectionAnchor(rows.last+linesMoved+1, 0);
|
selection.fromOrientedRange(selection.ranges[0]);
|
||||||
selection.$moveSelection(function() {
|
selection.rangeList.attach(this.session);
|
||||||
selection.moveCursorTo(rows.first+linesMoved, 0);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -482,7 +482,7 @@ var Editor = require("./editor").Editor;
|
||||||
this.inVirtualSelectionMode = true;
|
this.inVirtualSelectionMode = true;
|
||||||
for (var i = rangeList.ranges.length; i--;) {
|
for (var i = rangeList.ranges.length; i--;) {
|
||||||
if ($byLines) {
|
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--;
|
i--;
|
||||||
}
|
}
|
||||||
tmpSel.fromOrientedRange(rangeList.ranges[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);
|
}).call(Range.prototype);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue