diff --git a/common/content/buffer.js b/common/content/buffer.js index 5f866e21..77ff222f 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -985,6 +985,7 @@ function Buffer() //{{{ selController.wordMove(false, false); selController.wordMove(true, true); selController.setCaretEnabled(caretmode); + return String.match(selection, /\w*/)[0]; } let range = selection.getRangeAt(0); if (util.computedStyle(range.startContainer).whiteSpace == "pre" diff --git a/common/content/liberator.js b/common/content/liberator.js index 739c2cd0..f0aa1496 100644 --- a/common/content/liberator.js +++ b/common/content/liberator.js @@ -648,8 +648,9 @@ const liberator = (function () //{{{ triggerObserver: function (type) { + let args = Array.slice(arguments, 1); for (let [,fn] in Iterator(observers[type] || [])) - fn.apply(null, Array.slice(arguments, 1)); + fn.apply(null, args); }, beep: function () diff --git a/common/content/modes.js b/common/content/modes.js index 68be3c99..b00ec691 100644 --- a/common/content/modes.js +++ b/common/content/modes.js @@ -113,8 +113,7 @@ const modes = (function () //{{{ if (newMode == modes.NORMAL) { // disable caret mode when we want to switch to normal mode - let value = options.getPref("accessibility.browsewithcaret", false); - if (value) + if (options.getPref("accessibility.browsewithcaret")) options.setPref("accessibility.browsewithcaret", false); statusline.updateUrl(); @@ -171,7 +170,7 @@ const modes = (function () //{{{ // helper function to set both modes in one go // if silent == true, you also need to take care of the mode handling changes yourself - set: function (mainMode, extendedMode, silent) + set: function (mainMode, extendedMode, silent, stack) { silent = (silent || main == mainMode && extended == extendedMode); // if a main mode is set, the extended is always cleared @@ -187,6 +186,7 @@ const modes = (function () //{{{ if (main != oldMain) handleModeChange(oldMain, mainMode, oldExtended); } + liberator.triggerObserver("modeChange", [oldMain, oldExtended], [main, extended], stack); if (!silent) this.show(); @@ -195,18 +195,19 @@ const modes = (function () //{{{ push: function (mainMode, extendedMode, silent) { modeStack.push([main, extended]); - this.set(mainMode, extendedMode, silent); + this.set(mainMode, extendedMode, silent, { push: modeStack[modeStack.length - 1] }); }, pop: function (silent) { let a = modeStack.pop(); if (a) - this.set(a[0], a[1], silent); + this.set(a[0], a[1], silent, { pop: a }); else this.reset(silent); }, + // TODO: Deprecate this in favor of addMode? --Kris setCustomMode: function (modestr, oneventfunc, stopfunc) { // TODO this.plugin[id]... ('id' maybe submode or what..) @@ -247,19 +248,10 @@ const modes = (function () //{{{ set isReplaying(value) { isReplaying = value; this.show(); }, get main() main, - set main(value) - { - if (value != main) - handleModeChange(main, value); - - main = value; - // setting the main mode always resets any extended mode - extended = modes.NONE; - this.show(); - }, + set main(value) { this.set(value); }, get extended() extended, - set extended(value) { extended = value; this.show(); } + set extended(value) { this.set(null, value) } }; @@ -286,7 +278,6 @@ const modes = (function () //{{{ self.addMode("SEARCH_BACKWARD", true); self.addMode("MENU", true); // a popupmenu is active self.addMode("LINE", true); // linewise visual mode - self.addMode("RECORDING", true); self.addMode("PROMPT", true); return self;