add some more commands

This commit is contained in:
nightwing 2012-03-25 22:16:28 +04:00
commit d85e8b24f6

View file

@ -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);