add some more commands
This commit is contained in:
parent
fc500bb37a
commit
d85e8b24f6
1 changed files with 138 additions and 23 deletions
|
|
@ -88,10 +88,16 @@ function exec(command, editor, args) {
|
|||
if (editor && editor.$readOnly && !command.readOnly)
|
||||
return false;
|
||||
|
||||
if (/^(remove|insert|select|go|jumptomatching|del|backspace|to(?:upp|low)ercase)/.test(command.name)) {
|
||||
forEachSelection(editor, command, args)
|
||||
}else
|
||||
if (!command.multiCursor) {
|
||||
command.exec(editor, args || {});
|
||||
} else if (command.multiCursor == "forEach") {
|
||||
forEachSelection(editor, command, args)
|
||||
} else if (command.multiCursor == "single") {
|
||||
exitMultiSelectMode(editor);
|
||||
command.exec(editor, args || {});
|
||||
} else {
|
||||
command.multiCursor(editor, args || {});
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
|
|
@ -199,7 +205,7 @@ function addCursorV(editor, dir){
|
|||
var newRange = Range.fromPoints(anchor, lead)
|
||||
newRange.cursor = newRange.end
|
||||
}
|
||||
newRange.desiredColumn = editor.selection.$desiredColumn
|
||||
newRange.desiredColumn = screenLead.column;
|
||||
if (!editor.inMultiSelectMode) {
|
||||
addSelectionRange(editor, range)
|
||||
} else {
|
||||
|
|
@ -212,27 +218,140 @@ function addCursorV(editor, dir){
|
|||
if (toRemove)
|
||||
editor.selection.rangeList.substractPoint(toRemove)
|
||||
}
|
||||
|
||||
function transposeSelections(editor, dir) {
|
||||
var session = editor.session;
|
||||
var sel = session.multiSelection;
|
||||
var all = sel.rangeList.all;
|
||||
|
||||
var words = [];
|
||||
for (var i = all.length; i--; ) {
|
||||
var range = all[i]
|
||||
if (range.isEmpty()) {
|
||||
var tmp = session.getWordRange(range.start.row, range.start.column)
|
||||
range.start.row = tmp.start.row;
|
||||
range.start.column = tmp.start.column;
|
||||
range.end.row = tmp.end.row;
|
||||
range.end.column = tmp.end.column;
|
||||
}
|
||||
|
||||
words.unshift(editor.session.getTextRange(range));
|
||||
}
|
||||
if (dir < 0)
|
||||
words.unshift(words.pop());
|
||||
else
|
||||
words.push(words.shift());
|
||||
|
||||
for (var i = all.length; i--; ) {
|
||||
var range = all[i];
|
||||
var tmp = range.clone();
|
||||
session.replace(range, words[i]);
|
||||
range.start.row = tmp.start.row;
|
||||
range.start.column = tmp.start.column;
|
||||
}
|
||||
}
|
||||
|
||||
function splitIntoLines(editor) {
|
||||
var sel = editor.session.multiSelection
|
||||
if (sel.rangeCount > 1) {
|
||||
var ranges = sel.rangeList.ranges;
|
||||
var lastRange = ranges[ranges.length - 1]
|
||||
var range = Range.fromPoints(ranges[0].start, lastRange.end)
|
||||
|
||||
exitMultiSelectMode(editor)
|
||||
sel.setSelectionRange(range, lastRange.cursor == lastRange.start)
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
var Search = require("ace/search").Search
|
||||
var search = new Search
|
||||
|
||||
function find(session, needle, dir) {
|
||||
search.$options.wrap = false;
|
||||
search.$options.needle = needle;
|
||||
search.$options.backwards = dir == -1;
|
||||
return search.find(session)
|
||||
}
|
||||
function addRange(editor, dir, skip) {
|
||||
var session = editor.session;
|
||||
var sel = session.multiSelection;
|
||||
var all = sel.rangeList.all;
|
||||
|
||||
var range = sel.getRange();
|
||||
if (range.isEmpty()) {
|
||||
var tmp = session.getWordRange(range.start.row, range.start.column)
|
||||
var offset = tmp.start.column - range.start.column
|
||||
range = tmp;
|
||||
}
|
||||
var needle = session.getTextRange(range);
|
||||
|
||||
if (skip) {
|
||||
|
||||
}
|
||||
|
||||
var newRange = find(session, needle, dir);
|
||||
|
||||
newRange.cursor = dir == -1 ? newRange.start : newRange.end;
|
||||
addSelectionRange(editor, newRange)
|
||||
}
|
||||
// commands
|
||||
// add multicursor annotations to default commands
|
||||
var defaultCommands = require("./commands/default_commands").commands;
|
||||
|
||||
defaultCommands.forEach(function(command) {
|
||||
var single = RegExp(["selectall"].join("|"), "");
|
||||
var mapOverCommands = RegExp(["backspace", "del",
|
||||
"golinedown", "golineup", "gotoend", "gotoleft", "gotolineend", "gotolinestart",
|
||||
"gotoright", "gotostart", "gotowordleft", "gotowordright",
|
||||
"indent", "insertstring", "inserttext", "jumptomatching", "outdent",
|
||||
"removetolineend", "removetolinestart", "removewordleft", "removewordright",
|
||||
"selectdown", "selectleft", "selectlineend", "selectlinestart", "selectright",
|
||||
"selecttoend", "selecttolineend", "selecttolinestart", "selecttostart",
|
||||
"selectup", "selectwordleft", "selectwordright",
|
||||
"splitline", "tolowercase", "touppercase"].join("|"), "");
|
||||
|
||||
if (single.test(command.name))
|
||||
command.multiCursor = "single";
|
||||
else if (mapOverCommands.test(command.name))
|
||||
command.multiCursor = "forEach";
|
||||
else if (command.name == "transposeletters")
|
||||
command.multiCursor = transposeSelections
|
||||
});
|
||||
|
||||
// commands to to enter multicursor mode
|
||||
exports.defaultCommands = [{
|
||||
name: "addCursorAbove",
|
||||
exec: function(editor) {
|
||||
addCursorV(editor, -1)
|
||||
},
|
||||
bindKey: {
|
||||
win: "Alt-Shift-Up",
|
||||
mac: "Alt-Shift-Up"
|
||||
}
|
||||
exec: function(editor) {addCursorV(editor, -1); },
|
||||
bindKey: {win: "Alt-Shift-Up", mac: "Alt-Shift-Up"}
|
||||
}, {
|
||||
name: "addCursorBelow",
|
||||
exec: function(editor) {
|
||||
addCursorV(editor, 1)
|
||||
},
|
||||
bindKey: {
|
||||
win: "Alt-Shift-Down",
|
||||
mac: "Alt-Shift-Down"
|
||||
}
|
||||
}];
|
||||
exec: function(editor) {addCursorV(editor, 1); },
|
||||
bindKey: {win: "Alt-Shift-Down", mac: "Alt-Shift-Down"}
|
||||
}, {
|
||||
name: "selectMoreBefore",
|
||||
exec: function(editor) {addRange(editor, -1); },
|
||||
bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}
|
||||
}, {
|
||||
name: "selectMoreAfter",
|
||||
exec: function(editor) {addRange(editor, 1); },
|
||||
bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}
|
||||
}, {
|
||||
name: "selectNextBefore",
|
||||
exec: function(editor) {addCursorV(editor, -1, true); },
|
||||
bindKey: {win: "Ctrl-Shift-PageUp", mac: "Ctrl-Shift-PageUp"}
|
||||
}, {
|
||||
name: "selectNextAfter",
|
||||
exec: function(editor) {addCursorV(editor, 1, true); },
|
||||
bindKey: {win: "Ctrl-Shift-PageDown", mac: "Ctrl-Shift-PageDown"}
|
||||
}, {
|
||||
name: "splitIntoLines",
|
||||
exec: function(editor) {splitIntoLines(editor); },
|
||||
bindKey: {win: "Ctrl-Shift-L", mac: "Ctrl-Shift-L"}
|
||||
}, ];
|
||||
|
||||
// commands active when multiple cursors are present
|
||||
exports.multiEditCommands = [{
|
||||
name: "singleSelection",
|
||||
bindKey: "esc",
|
||||
|
|
@ -421,10 +540,6 @@ function onMouseDown(e) {
|
|||
}
|
||||
}
|
||||
|
||||
function altSelect(ev) {
|
||||
|
||||
}
|
||||
|
||||
// MultiCursor
|
||||
function MultiCursor(editor) {
|
||||
initSession(editor.session);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue