diff --git a/lib/ace/commands/occur_commands.js b/lib/ace/commands/occur_commands.js index c93c4da3..88e05eda 100644 --- a/lib/ace/commands/occur_commands.js +++ b/lib/ace/commands/occur_commands.js @@ -37,8 +37,9 @@ var config = require("../config"), var occurStartCommands = [{ name: "occur", exec: function(editor, options) { + var alreadyInOccur = !!editor.session.$occur; var occurSessionActive = new Occur().enter(editor, options); - if (occurSessionActive) OccurKeyboardHandler.installIn(editor); + if (occurSessionActive && !alreadyInOccur) OccurKeyboardHandler.installIn(editor); }, readOnly: true }]; @@ -50,7 +51,7 @@ var occurCommands = [{ var occur = editor.session.$occur; if (!occur) return; occur.exit(editor, {}); - OccurKeyboardHandler.uninstallFrom(editor); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); }, readOnly: true }, { @@ -60,7 +61,7 @@ var occurCommands = [{ var occur = editor.session.$occur; if (!occur) return; occur.exit(editor, {translatePosition: true}); - OccurKeyboardHandler.uninstallFrom(editor); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); }, readOnly: true }]; diff --git a/lib/ace/occur_test.js b/lib/ace/occur_test.js index 0b5744d5..88b67f5b 100644 --- a/lib/ace/occur_test.js +++ b/lib/ace/occur_test.js @@ -120,6 +120,29 @@ module.exports = { editor.execCommand('occuraccept'); assert.position(editor.getCursorPosition(), 3, 1, 'occur -> original pos'); + }, + + "test: recursive occur" : function() { + // setup + var text = 'x\nabc1\nx\nabc2\n'; + editor.session.insert({row: 0, column: 0}, text); + editor.commands.addCommands(occurCommands); + + // orig -> occur1 + editor.execCommand('occur', {needle: 'abc'}); + assert.equal(editor.getValue(), 'abc1\nabc2', "orig -> occur1"); + + // occur1 -> occur2 + editor.execCommand('occur', {needle: '2'}); + assert.equal(editor.getValue(), 'abc2', "occur1 -> occur2"); + + // occur2 -> occur1 + editor.execCommand('occurexit'); + assert.equal(editor.getValue(), 'abc1\nabc2', "occur2 -> occur1"); + + // occur1 -> orig + editor.execCommand('occurexit'); + assert.equal(editor.getValue(), text, "occur1 -> orig"); } };