From d85e8b24f65386e1e1f7f39829331c8c35849fc1 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 25 Mar 2012 22:16:28 +0400 Subject: [PATCH] add some more commands --- lib/ace/multi_cursor.js | 161 ++++++++++++++++++++++++++++++++++------ 1 file changed, 138 insertions(+), 23 deletions(-) diff --git a/lib/ace/multi_cursor.js b/lib/ace/multi_cursor.js index 3e948318..14b73a1d 100644 --- a/lib/ace/multi_cursor.js +++ b/lib/ace/multi_cursor.js @@ -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);