From 155f1c8b95ffb546484ceda113ed9312f68addab Mon Sep 17 00:00:00 2001 From: hogelog Date: Mon, 11 May 2009 15:31:34 +0000 Subject: * fix hinttimeout bug. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@33246 d0d07461-0603-4401-acd4-de1884942a52 --- char-hints-mod2.js | 604 +++++++++++++++++++++++++++-------------------------- 1 file changed, 311 insertions(+), 293 deletions(-) diff --git a/char-hints-mod2.js b/char-hints-mod2.js index cf07235..ca030ee 100644 --- a/char-hints-mod2.js +++ b/char-hints-mod2.js @@ -1,293 +1,311 @@ -// PLUGIN_INFO//{{{ -var PLUGIN_INFO = - - {NAME} - character hint mode. - hogelog - 0.2.7 - 2.0pre 2008/12/12 - 2.0pre - http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/char-hints-mod2.js - - -; -//}}} - -(function () { - - const DEFAULT_HINTCHARS = "HJKLASDFGYUIOPQWERTNMZXCVB"; - const hintContext = hints.addMode; - - let hintchars = DEFAULT_HINTCHARS; - let inputCase = function(str) str.toUpperCase(); - let inputRegex = /[A-Z]/; - let showCase = function(str) str.toUpperCase(); - let getStartCount = function() 0; - - function chars2num(chars) //{{{ - { - let num = 0; - hintchars = inputCase(hintchars); - let base = hintchars.length; - for(let i=0,l=chars.length;i0); - - return chars; - } //}}} - function getAdjustStartCount(base, count) //{{{ - { - if(count < base) { - return 0; - } else if(count >= Math.pow(base, 2)) { - return base; - } - var start = Math.floor(count / base); - var adjust = count + start; - var next_start; - while(start != (next_start = Math.floor(adjust / base))) { - adjust += start; - start = next_start; - } - return start; - } //}}} - function getCharHints(win) //{{{ - { - let hints = []; - (function (win) { - let elems = [elem for(elem in buffer.evaluateXPath('//*[@liberator:highlight="Hint" and @number]', win.document))]; - hints = hints.concat(elems); - Array.forEach(win.frames, arguments.callee); - })(win); - return hints; - } //}}} - function showCharHints(hints) //{{{ - { - let start = getStartCount(hintchars.length, hints.length); - for(let i=0,len=hints.length;i0) processHintInput(hintInput, hints); - }, //}}} - onEvent: function (event) //{{{ - { - if(/^\d$/.test(events.toString(event))) { - charhints.onInput(event); - } else { - charhints.original.onEvent(event); - statusline.updateInputBuffer(hintInput); - } - }, //}}} - processHints: function (followFirst) //{{{ - { - // don't followFirst if processHints call from - // charhints.original.onEvent(alt) in processHintInput - let caller = arguments.callee.caller; - if(caller == charhints.original.onEvent && caller.caller == processHintInput) - return charhints.original.processHints(false); - - return charhints.original.processHints(followFirst); - }, //}}} - }; - - if(!charhints.original) { - charhints.original = { - show: hints.show, - onInput: liberator.eval("onInput", hintContext), - onEvent: hints.onEvent, - processHints: liberator.eval("processHints", hintContext), - }; - - charhints.install = function () //{{{ - { - hints.show = charhints.show; - hints.onEvent = charhints.onEvent; - liberator.eval("onInput = plugins.charhints.onInput", hintContext); - liberator.eval("processHints = plugins.charhints.processHints", hintContext); - - liberator.execute(":hi Hint::after content: attr(hintchar)", true, true); - if(liberator.globalVariables.hintsio) { - let hintsio = liberator.globalVariables.hintsio; - Array.forEach(hintsio, setIOType); - } - if(liberator.globalVariables.hintchars) { - hintchars = liberator.globalVariables.hintchars; - } - if(liberator.globalVariables.hintlabeling) { - switch(liberator.globalVariables.hintlabeling) { - default: - case "s": - getStartCount = function() 0; - break; - case "a": - getStartCount = getAdjustStartCount; - break; - } - } - }; //}}} - charhints.uninstall = function () //{{{ - { - hints.show = charhints.original.show; - hints.onEvent = charhints.original.onEvent; - liberator.eval("onInput = plugins.charhints.original.onInput", hintContext); - liberator.eval("processHints = plugins.charhints.original.processHints", hintContext); - - liberator.execute(":hi Hint::after content: attr(number)", true, true); - }; //}}} - } - charhints.install(); -})(); - -// vim: set fdm=marker sw=4 ts=4 et fenc=utf-8: +// PLUGIN_INFO//{{{ +var PLUGIN_INFO = + + {NAME} + character hint mode. + hogelog + 0.3.0 + 2.0pre 2008/12/12 + 2.1pre + http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/char-hints-mod2.js + + +; +//}}} + +(function () { + + const DEFAULT_HINTCHARS = "HJKLASDFGYUIOPQWERTNMZXCVB"; + const hintContext = hints.addMode; + + let hintchars = DEFAULT_HINTCHARS; + let inputCase = function(str) str.toUpperCase(); + let inputRegex = /[A-Z]/; + let showCase = function(str) str.toUpperCase(); + let getStartCount = function() 0; + + let timer = null; + + function chars2num(chars) //{{{ + { + let num = 0; + hintchars = inputCase(hintchars); + let base = hintchars.length; + for(let i=0,l=chars.length;i0); + + return chars; + } //}}} + function getAdjustStartCount(base, count) //{{{ + { + if(count < base) { + return 0; + } else if(count >= Math.pow(base, 2)) { + return base; + } + var start = Math.floor(count / base); + var adjust = count + start; + var next_start; + while(start != (next_start = Math.floor(adjust / base))) { + adjust += start; + start = next_start; + } + return start; + } //}}} + function getCharHints(win) //{{{ + { + let hints = []; + (function (win) { + let elems = [elem for(elem in buffer.evaluateXPath('//*[@liberator:highlight="Hint" and @number]', win.document))]; + hints = hints.concat(elems); + Array.forEach(win.frames, arguments.callee); + })(win); + return hints; + } //}}} + function showCharHints(hints) //{{{ + { + let start = getStartCount(hintchars.length, hints.length); + for(let i=0,len=hints.length;i 0) { + // -100 to prevent the conflict with original timeout. + timer = setTimeout(function () { + if (hints.activeTimeout) { + clearTimeout(hints.activeTimeout); + hints.activeTimeout = null; + } + charhints.original.processHints(true); + }, timeout - 100); + } + + } //}}} + + var hintInput = ""; + var charhints = plugins.charhints = { + show: function (minor, filter, win) //{{{ + { + charhints.original.show(minor, filter, win); + hintInput = ""; + let hints = getCharHints(window.content); + showCharHints(hints); + }, //}}} + onInput: function (event) //{{{ + { + let eventkey = events.toString(event); + if(/^\d$/.test(eventkey)) { + commandline.command += eventkey; + } + let hintString = commandline.command; + commandline.command = hintString.replace(inputRegex, ""); + + charhints.original.onInput(event); + + for(let i=0,l=hintString.length;i0) processHintInput(hintInput, hints); + }, //}}} + onEvent: function (event) //{{{ + { + if(/^\d$/.test(events.toString(event))) { + charhints.onInput(event); + } else { + charhints.original.onEvent(event); + statusline.updateInputBuffer(hintInput); + } + }, //}}} + processHints: function (followFirst) //{{{ + { + // don't followFirst if processHints call from + // charhints.original.onEvent(alt) in processHintInput + let caller = arguments.callee.caller; + if(caller == charhints.original.onEvent && caller.caller == processHintInput) + return charhints.original.processHints(false); + + return charhints.original.processHints(followFirst); + }, //}}} + }; + + if(!charhints.original) { + charhints.original = { + show: hints.show, + onInput: liberator.eval("onInput", hintContext), + onEvent: hints.onEvent, + processHints: liberator.eval("processHints", hintContext), + }; + + charhints.install = function () //{{{ + { + hints.show = charhints.show; + hints.onEvent = charhints.onEvent; + liberator.eval("onInput = plugins.charhints.onInput", hintContext); + liberator.eval("processHints = plugins.charhints.processHints", hintContext); + + liberator.execute(":hi Hint::after content: attr(hintchar)", true, true); + if(liberator.globalVariables.hintsio) { + let hintsio = liberator.globalVariables.hintsio; + Array.forEach(hintsio, setIOType); + } + if(liberator.globalVariables.hintchars) { + hintchars = liberator.globalVariables.hintchars; + } + if(liberator.globalVariables.hintlabeling) { + switch(liberator.globalVariables.hintlabeling) { + default: + case "s": + getStartCount = function() 0; + break; + case "a": + getStartCount = getAdjustStartCount; + break; + } + } + }; //}}} + charhints.uninstall = function () //{{{ + { + hints.show = charhints.original.show; + hints.onEvent = charhints.original.onEvent; + liberator.eval("onInput = plugins.charhints.original.onInput", hintContext); + liberator.eval("processHints = plugins.charhints.original.processHints", hintContext); + + liberator.execute(":hi Hint::after content: attr(number)", true, true); + }; //}}} + } + charhints.install(); +})(); + +// vim: set fdm=marker sw=4 ts=4 et fenc=utf-8: -- cgit v1.2.3