diff --git a/lib/ace/incremental_search.js b/lib/ace/incremental_search.js index 1587e77f..e158b6d5 100644 --- a/lib/ace/incremental_search.js +++ b/lib/ace/incremental_search.js @@ -71,6 +71,7 @@ oop.inherits(IncrementalSearch, Search); this.$options.needle = ''; this.$options.backwards = backwards; editor.keyBinding.addKeyboardHandler(this.$keyboardHandler); + this.selectionFix(editor); // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- var msg = this.$options.backwards ? 'reverse-' : ''; msg += 'isearch: ' + this.$options.needle; @@ -83,6 +84,16 @@ oop.inherits(IncrementalSearch, Search); this.message(''); } + this.selectionFix = function(editor) { + // Fix selection bug: When clicked inside the editor + // editor.selection.$isEmpty is false even if the mouse click did not + // open a selection. This is interpreted by the move commands to + // extend the selection. To only extend the selection when there is + // one, we clear it here + if (editor.selection.isEmpty() && !editor.session.$emacsMark) { + editor.clearSelection(); + } + } this.cancelSearch = function(reset) { var e = this.$editor; this.$prevNeedle = this.$options.needle; diff --git a/lib/ace/incremental_search_test.js b/lib/ace/incremental_search_test.js index 4d064f75..66129991 100644 --- a/lib/ace/incremental_search_test.js +++ b/lib/ace/incremental_search_test.js @@ -161,6 +161,28 @@ module.exports = { iSearch.activate(editor); iSearch.next({backwards: false, useCurrentOrPrevSearch: true}); assert.position(editor.getCursorPosition(), 1, 5); + }, + + "test: don't extend selection range if selection is empty" : function() { + iSearch.activate(editor); + iSearch.addChar('1'); iSearch.addChar('2');; + testRanges("Range: [0/5] -> [0/5]", [editor.getSelectionRange()], "sel range"); + }, + + "test: extend selection range if selection exists" : function() { + iSearch.activate(editor); + editor.selection.selectTo(0, 1); + iSearch.addChar('1'); iSearch.addChar('2');; + testRanges("Range: [0/0] -> [0/5]", [editor.getSelectionRange()], "sel range"); + }, + + "test: extend selection in emacs mark mode" : function() { + var emacs = require('ace/keyboard/emacs'); + editor.keyBinding.addKeyboardHandler(emacs.handler); + emacs.handler.commands.setMark.exec(editor); + iSearch.activate(editor); + iSearch.addChar('1'); iSearch.addChar('2');; + testRanges("Range: [0/0] -> [0/5]", [editor.getSelectionRange()], "sel range"); } };