// 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) {
timer = setTimeout(function () {
charhints.original.processHints(true);
}, timeout);
}
} //}}}
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);
clearOriginalTimeout();
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: