From ea67201540eedf6dd2347e9fa9c1d0fd6d738789 Mon Sep 17 00:00:00 2001 From: Robert Krahn Date: Mon, 24 Mar 2014 16:16:54 -0700 Subject: [PATCH] emacs: fix exchangePointAndMark in normal select mode --- lib/ace/keyboard/emacs.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/lib/ace/keyboard/emacs.js b/lib/ace/keyboard/emacs.js index 7c88af38..b1543894 100644 --- a/lib/ace/keyboard/emacs.js +++ b/lib/ace/keyboard/emacs.js @@ -481,24 +481,25 @@ exports.handler.addCommands({ exchangePointAndMark: { exec: function (editor, args) { var restoreMarks = []; - editor.forEachSelection({ - exec: function() { - var sel = editor.selection; - if (args.count) { // replace mark and point - var pos = {row: sel.lead.row, column: sel.lead.column}; - restoreMarks.push(pos); - sel.clearSelection(); - sel.moveCursorToPosition(editor.popEmacsMark()); - } else if (sel.isEmpty()) { // move to mark, forget point - var lastMark = editor.popEmacsMark(); - restoreMarks.push(lastMark); - sel.selectToPosition(lastMark); - } else { // just invert selection - sel.setSelectionRange(sel.getRange(), !sel.isBackwards()); - } - } - }); + if (editor.inMultiSelectMode) editor.forEachSelection({exec: doExchange}); + else doExchange(); restoreMarks.reverse().forEach(function(p) { editor.pushEmacsMark(p); }); + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + function doExchange() { + var sel = editor.selection; + if (args.count) { // replace mark and point + var pos = {row: sel.lead.row, column: sel.lead.column}; + restoreMarks.push(pos); + sel.clearSelection(); + sel.moveCursorToPosition(editor.popEmacsMark()); + } else if (sel.isEmpty()) { // move to mark, forget point + var lastMark = editor.popEmacsMark(); + restoreMarks.push(lastMark); + sel.selectToPosition(lastMark); + } else { // just invert selection + sel.setSelectionRange(sel.getRange(), !sel.isBackwards()); + } + } }, readOnly: true, handlesCount: true,