Merge pull request #1976 from AMiniLegend/master
Added three new functions for selections:
This commit is contained in:
commit
bec92e678d
1 changed files with 95 additions and 0 deletions
|
|
@ -33,6 +33,7 @@ define(function(require, exports, module) {
|
||||||
|
|
||||||
var lang = require("../lib/lang");
|
var lang = require("../lib/lang");
|
||||||
var config = require("../config");
|
var config = require("../config");
|
||||||
|
var Range = require("../range").Range;
|
||||||
|
|
||||||
function bindKey(win, mac) {
|
function bindKey(win, mac) {
|
||||||
return {win: win, mac: mac};
|
return {win: win, mac: mac};
|
||||||
|
|
@ -602,6 +603,100 @@ exports.commands = [{
|
||||||
exec: function(editor) { editor.toLowerCase(); },
|
exec: function(editor) { editor.toLowerCase(); },
|
||||||
multiSelectAction: "forEach",
|
multiSelectAction: "forEach",
|
||||||
scrollIntoView: "cursor"
|
scrollIntoView: "cursor"
|
||||||
|
}, {
|
||||||
|
name: "expandtoline",
|
||||||
|
bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"),
|
||||||
|
exec: function(editor) {
|
||||||
|
var range = editor.selection.getRange();
|
||||||
|
|
||||||
|
range.start.column = range.end.column = 0;
|
||||||
|
range.end.row++;
|
||||||
|
editor.selection.setRange(range, false);
|
||||||
|
},
|
||||||
|
multiSelectAction: "forEach",
|
||||||
|
scrollIntoView: "cursor",
|
||||||
|
readOnly: true
|
||||||
|
}, {
|
||||||
|
name: "joinlines",
|
||||||
|
bindKey: bindKey(null, null),
|
||||||
|
exec: function(editor) {
|
||||||
|
var isBackwards = editor.selection.isBackwards();
|
||||||
|
var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();
|
||||||
|
var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();
|
||||||
|
var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length
|
||||||
|
var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());
|
||||||
|
var selectedCount = selectedText.replace(/\n\s*/, " ").length;
|
||||||
|
var insertLine = editor.session.doc.getLine(selectionStart.row);
|
||||||
|
|
||||||
|
for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {
|
||||||
|
var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));
|
||||||
|
if (curLine.length !== 0) {
|
||||||
|
curLine = " " + curLine;
|
||||||
|
}
|
||||||
|
insertLine += curLine;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {
|
||||||
|
// Don't insert a newline at the end of the document
|
||||||
|
insertLine += editor.session.doc.getNewLineCharacter();
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.clearSelection();
|
||||||
|
editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);
|
||||||
|
|
||||||
|
if (selectedCount > 0) {
|
||||||
|
// Select the text that was previously selected
|
||||||
|
editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);
|
||||||
|
editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);
|
||||||
|
} else {
|
||||||
|
// If the joined line had something in it, start the cursor at that something
|
||||||
|
firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;
|
||||||
|
editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
multiSelectAction: "forEach",
|
||||||
|
readOnly: true
|
||||||
|
}, {
|
||||||
|
name: "invertSelection",
|
||||||
|
bindKey: bindKey(null, null),
|
||||||
|
exec: function(editor) {
|
||||||
|
var endRow = editor.session.doc.getLength() - 1;
|
||||||
|
var endCol = editor.session.doc.getLine(endRow).length;
|
||||||
|
var ranges = editor.selection.rangeList.ranges;
|
||||||
|
var newRanges = [];
|
||||||
|
|
||||||
|
// If multiple selections don't exist, rangeList will return 0 so replace with single range
|
||||||
|
if (ranges.length < 1) {
|
||||||
|
ranges = [editor.selection.getRange()];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (i == (ranges.length - 1)) {
|
||||||
|
// The last selection must connect to the end of the document, unless it already does
|
||||||
|
if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {
|
||||||
|
newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i === 0) {
|
||||||
|
// The first selection must connect to the start of the document, unless it already does
|
||||||
|
if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {
|
||||||
|
newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.exitMultiSelectMode();
|
||||||
|
editor.clearSelection();
|
||||||
|
|
||||||
|
for(var i = 0; i < newRanges.length; i++) {
|
||||||
|
editor.selection.addRange(newRanges[i], false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
readOnly: true,
|
||||||
|
scrollIntoView: "none"
|
||||||
}];
|
}];
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue