anekos
New BSD License
-
:fmap
:fmap -events=event-name-list lhs rhs
fmaps examples for .vimperatorrc
If you input directly these commands in vimperator commandline, remove the ":lazy".
:command! -nargs=+ lazy autocmd VimperatorEnter .* <args>
:lazy fmaps -u='mail\.google\.com/mail' c / j k n p o u e x s r a # [ ] ? gi gs gt gd ga gc
:lazy fmaps -u='mail\.google\.com/mail/.*/[0-9a-f]+$' c / j,n k,p n,j p,k o u e x s r a # [ ] ? gi gs gt gd ga gc
:lazy fmaps -u='www\.google\.co\.jp/reader' -events=vkeypress j k n p m s v A r S N P X O gh ga gs gt gu u / ? J K
:lazy fmaps -u='(fastladder|livedoor)\.com/reader' j k s a p o v c i,p <Space> <S-Space> z b < > q w e,g
:lazy fmaps -u='https?://www\.rememberthemilk\.com/home/' j k m i c t ? d F,f G,g S,s L,l Y,y H,h M,m <Del> <C-S-Left> <C-S-Right>
:lazy fmaps -u='http://code.google.com/p/vimperator-labs/issues/list' o j k
:lazy fmaps -u='http://code.google.com/p/vimperator-labs/issues/detail' u
;
// }}}
(function () {
const EVENTS = 'keypress keydown keyup'.split(/\s+/);
const EVENTS_WITH_V = EVENTS.concat(['v' + n for each (n in EVENTS)]);
const VKeys = {
'0': KeyEvent.DOM_VK_0,
'1': KeyEvent.DOM_VK_1,
'2': KeyEvent.DOM_VK_2,
'3': KeyEvent.DOM_VK_3,
'4': KeyEvent.DOM_VK_4,
'5': KeyEvent.DOM_VK_5,
'6': KeyEvent.DOM_VK_6,
'7': KeyEvent.DOM_VK_7,
'8': KeyEvent.DOM_VK_8,
'9': KeyEvent.DOM_VK_9,
';': KeyEvent.DOM_VK_SEMICOLON,
'=': KeyEvent.DOM_VK_EQUALS,
'a': KeyEvent.DOM_VK_A,
'b': KeyEvent.DOM_VK_B,
'c': KeyEvent.DOM_VK_C,
'd': KeyEvent.DOM_VK_D,
'e': KeyEvent.DOM_VK_E,
'f': KeyEvent.DOM_VK_F,
'g': KeyEvent.DOM_VK_G,
'h': KeyEvent.DOM_VK_H,
'i': KeyEvent.DOM_VK_I,
'j': KeyEvent.DOM_VK_J,
'k': KeyEvent.DOM_VK_K,
'l': KeyEvent.DOM_VK_L,
'm': KeyEvent.DOM_VK_M,
'n': KeyEvent.DOM_VK_N,
'o': KeyEvent.DOM_VK_O,
'p': KeyEvent.DOM_VK_P,
'q': KeyEvent.DOM_VK_Q,
'r': KeyEvent.DOM_VK_R,
's': KeyEvent.DOM_VK_S,
't': KeyEvent.DOM_VK_T,
'u': KeyEvent.DOM_VK_U,
'v': KeyEvent.DOM_VK_V,
'w': KeyEvent.DOM_VK_W,
'x': KeyEvent.DOM_VK_X,
'y': KeyEvent.DOM_VK_Y,
'z': KeyEvent.DOM_VK_Z,
'*': KeyEvent.DOM_VK_MULTIPLY,
'+': KeyEvent.DOM_VK_ADD,
'-': KeyEvent.DOM_VK_SUBTRACT,
',': KeyEvent.DOM_VK_COMMA,
'.': KeyEvent.DOM_VK_PERIOD,
'/': KeyEvent.DOM_VK_SLASH,
'?': KeyEvent.DOM_VK_SLASH,
'`': KeyEvent.DOM_VK_BACK_QUOTE,
'{': KeyEvent.DOM_VK_OPEN_BRACKET,
'\\': KeyEvent.DOM_VK_BACK_SLASH,
'}': KeyEvent.DOM_VK_CLOSE_BRACKET,
'\'': KeyEvent.DOM_VK_QUOTE
};
function id (v)
v;
function or (list, func)
let ([head, tail] = list)
((func || v)(head) || (tail && or(tail, func)));
function getFrames () {
function bodyCheck (content)
(content.document.body.localName.toLowerCase() === 'body');
function get (content)
(bodyCheck(content) && result.push(content), Array.slice(content.frames).forEach(get))
let result = [];
get(content);
return result;
}
function fromXPath (doc, xpath) {
let result = util.evaluateXPath(xpath, doc);
return result.snapshotLength && result.snapshotItem(0);
}
function createEvent (eventName, event) {
let result = content.document.createEvent('KeyEvents');
result.initKeyEvent(
eventName,
true,
true,
content,
event.ctrlKey,
event.altKey,
event.shiftKey,
event.metaKey,
event.keyCode,
event.charCode
);
return result;
}
function virtualize (event) {
let cc = event.charCode;
if (/^[A-Z]$/.test(String.fromCharCode(cc)))
event.shiftKey = true;
event.keyCode = VKeys[String.fromCharCode(cc).toLowerCase()];
event.charCode = 0;
return event;
}
function feed (keys, eventNames, target) {
let _passAllKeys = modes.passAllKeys;
modes.passAllKeys = true;
modes.passNextKey = false;
for (let [, keyEvent] in Iterator(events.fromString(keys))) {
eventNames.forEach(function (eventName) {
let [, vkey, name] = eventName.match(/^(v)?(.+)$/);
if (vkey)
virtualize(keyEvent);
let event = createEvent(name, keyEvent);
target.dispatchEvent(event);
});
}
modes.passAllKeys = _passAllKeys;
}
function regexpValidator (expr) {
try {
RegExp(expr);
return true;
} catch (e) {}
return false;
}
function makeListValidator (list)
function (values)
(values && !values.some(function (value) !list.some(function (event) event === value)));
'fmap fmaps'.split(/\s+/).forEach(function (cmd) {
let multi = cmd === 'fmaps';
function action (multi) {
return function (args) {
function add ([lhs, rhs]) {
rhs = rhs || lhs;
mappings.addUserMap(
[modes.NORMAL],
[lhs],
args['description'] || 'by feedSomeKeys_3.js',
function () {
function body (win)
(win.document.body || win.document);
let win = document.commandDispatcher.focusedWindow;
let frames = getFrames();
let elem = body(win);
if (typeof args['-frame'] !== 'undefined') {
frames = [frames[args['-frame']]];
elem = body(frames[0]);
}
if (args['-xpath'])
elem = or(frames, function (f) fromXPath(f, args['-xpath'])) || elem;
feed(rhs, args['-events'] || ['keypress'], elem);
},
{
matchingUrls: args['-urls']
},
true
);
}
if (multi) {
let sep = let (s = args['-separator'] || ',') function (v) v.split(s);
args.literalArg.split(/\s+/).map(String.trim).map(sep).forEach(add);
} else {
let [, lhs, rhs] = args.literalArg.match(/^(\S+)\s+(.*)$/) || args.literalArg;
add([lhs, rhs]);
}
};
}
commands.addUserCommand(
[cmd],
'Feed map a key sequence',
action(multi),
{
literal: 0,
options: [
[['-urls', '-u'], commands.OPTION_STRING, regexpValidator],
[['-desc', '-description'], commands.OPTION_STRING],
[['-frame', '-f'], commands.OPTION_INT],
[
['-events', '-e'],
commands.OPTION_LIST,
makeListValidator(EVENTS_WITH_V),
EVENTS_WITH_V.map(function (v) [v, v])
]
].concat(
multi ? [[['-separator', '-s'], commands.OPTION_STRING]]
: []
)
},
true
);
});
__context__.API =
'VKeys feed getFrames fromXPath virtualize'.split(/\s+/).reduce(
function (result, name)
(result[name] = eval(name), result),
{}
);
})();
// vim:sw=2 ts=2 et si fdm=marker: