From 2bfa73504c735e0b2df2d27ee0567adecc3510ff Mon Sep 17 00:00:00 2001 From: retlet Date: Wed, 5 Nov 2008 08:39:33 +0000 Subject: 動作確認とれたのでtrunkからコピー git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/branches/1.2@22766 d0d07461-0603-4401-acd4-de1884942a52 --- feedSomeKeys_2.js | 338 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 feedSomeKeys_2.js (limited to 'feedSomeKeys_2.js') diff --git a/feedSomeKeys_2.js b/feedSomeKeys_2.js new file mode 100644 index 0000000..f5ac206 --- /dev/null +++ b/feedSomeKeys_2.js @@ -0,0 +1,338 @@ +/** + * ==VimperatorPlugin== + * @name feedSomeKeys 2 + * @description feed some defined key events into the Web content + * @description-ja 定義したkeyイベントをWebページ側へ送ってあげます + * @author teramako teramako@gmail.com + * @version 2.0a + * ==/VimperatorPlugin== + * + * 英語での説明を放棄する + * + * XXX: feedSomeKeys.js の改良版仕様を変更したのでフォーク + * + * keyイベント(正確にはkepressイベント)をWebコンテンツ側へ送る事を可能にするプラグイン + * Gmailとかlivedoor ReaderとかGreasemonkeyでキーを割り当てている場合に活躍するでしょう。 + * それ以外の場面ではむしろ邪魔になる諸刃の剣 + * + * :f[eed]map lhs [...] -> lhsのキーマップをそのままWebコンテンツへ + * :f[eed]map lhs,[num]rhs [...] -> lhsのキーマップをrhsへ変換してWebコンテンツへ + * [num]はフレームの番号(省略時はトップウィンドウへイベントが送られる) + * :f[eed]map -d[epth] {num} ... -> {num}はフレームの番号で :fmap lhs1,{num}rhs1 lhs2,{num}rhs2 ... と同等 + * Gmailの例を参照 + * :f[eed]map -v[key] .... -> 仮想キーコードでイベントを送るように + * + * :fmapc + * :feedmapclear -> 全てを無に帰して元に戻す + * + * :f[eed]map! lhs ... -> "!" をつけると、一旦すべてのfeedKeysを元に戻しての再定義 + * + * autocmdと組み合わせる場合は + * :autocmd LocationChange .* :fmapc + * を最初に登録してください。でないと対象外のページに移ったときに設定が前のものを引きずることになります。 + * + * また、下記設定例はvimperator 2.0pre用で1.2の場合は\を一つに削ってください。 + * + * == LDR の場合 == + * :autocmd LocationChange .* :fmapc + * :autocmd LocationChange reader\\.livedoor\\.com/reader :fmap j k s a p o v c z b < > + * + * とかやると幸せになれるかも。 + * + * == Gmail の場合 == + * :autocmd LocationChange .* :fmapc + * :autocmd LocationChange mail\\.google\\.com/mail :fmap -depth 4 c / j k n p o u e x s r a # [ ] z ? gi gs gt gd ga gc + * + * とかやると幸せになれるかもしれません。 + * + * == Google Reader の場合 == + * :autocmd LocationChange .* :fmapc + * :autocmd LocationChange www\\.google\\.co\\.jp/reader :fmap! -vkey j k n p m s t v A r S N P X O gh ga gs gt gu u / ? + * + * Greasemonkey LDRizeの場合などにも使用可 + */ + +liberator.plugins.feedKey = (function(){ +var origMaps = []; +var feedMaps = []; + +// keyTableの再定義...ひどく不毛... +const keyTable = [ + [ KeyEvent.DOM_VK_BACK_SPACE, ["BS"] ], + [ KeyEvent.DOM_VK_TAB, ["Tab"] ], + [ KeyEvent.DOM_VK_RETURN, ["Return", "CR", "Enter"] ], + //[ KeyEvent.DOM_VK_ENTER, ["Enter"] ], + [ KeyEvent.DOM_VK_ESCAPE, ["Esc", "Escape"] ], + [ KeyEvent.DOM_VK_SPACE, ["Spc", "Space"] ], + [ KeyEvent.DOM_VK_PAGE_UP, ["PageUp"] ], + [ KeyEvent.DOM_VK_PAGE_DOWN, ["PageDown"] ], + [ KeyEvent.DOM_VK_END, ["End"] ], + [ KeyEvent.DOM_VK_HOME, ["Home"] ], + [ KeyEvent.DOM_VK_LEFT, ["Left"] ], + [ KeyEvent.DOM_VK_UP, ["Up"] ], + [ KeyEvent.DOM_VK_RIGHT, ["Right"] ], + [ KeyEvent.DOM_VK_DOWN, ["Down"] ], + [ KeyEvent.DOM_VK_INSERT, ["Ins", "Insert"] ], + [ KeyEvent.DOM_VK_DELETE, ["Del", "Delete"] ], + [ KeyEvent.DOM_VK_F1, ["F1"] ], + [ KeyEvent.DOM_VK_F2, ["F2"] ], + [ KeyEvent.DOM_VK_F3, ["F3"] ], + [ KeyEvent.DOM_VK_F4, ["F4"] ], + [ KeyEvent.DOM_VK_F5, ["F5"] ], + [ KeyEvent.DOM_VK_F6, ["F6"] ], + [ KeyEvent.DOM_VK_F7, ["F7"] ], + [ KeyEvent.DOM_VK_F8, ["F8"] ], + [ KeyEvent.DOM_VK_F9, ["F9"] ], + [ KeyEvent.DOM_VK_F10, ["F10"] ], + [ KeyEvent.DOM_VK_F11, ["F11"] ], + [ KeyEvent.DOM_VK_F12, ["F12"] ], + [ KeyEvent.DOM_VK_F13, ["F13"] ], + [ KeyEvent.DOM_VK_F14, ["F14"] ], + [ KeyEvent.DOM_VK_F15, ["F15"] ], + [ KeyEvent.DOM_VK_F16, ["F16"] ], + [ KeyEvent.DOM_VK_F17, ["F17"] ], + [ KeyEvent.DOM_VK_F18, ["F18"] ], + [ KeyEvent.DOM_VK_F19, ["F19"] ], + [ KeyEvent.DOM_VK_F20, ["F20"] ], + [ KeyEvent.DOM_VK_F21, ["F21"] ], + [ KeyEvent.DOM_VK_F22, ["F22"] ], + [ KeyEvent.DOM_VK_F23, ["F23"] ], + [ KeyEvent.DOM_VK_F24, ["F24"] ], +]; +const vkeyTable = [ + [ KeyEvent.DOM_VK_0, ['0'] ], + [ KeyEvent.DOM_VK_1, ['1'] ], + [ KeyEvent.DOM_VK_2, ['2'] ], + [ KeyEvent.DOM_VK_3, ['3'] ], + [ KeyEvent.DOM_VK_4, ['4'] ], + [ KeyEvent.DOM_VK_5, ['5'] ], + [ KeyEvent.DOM_VK_6, ['6'] ], + [ KeyEvent.DOM_VK_7, ['7'] ], + [ KeyEvent.DOM_VK_8, ['8'] ], + [ KeyEvent.DOM_VK_9, ['9'] ], + [ KeyEvent.DOM_VK_SEMICOLON, [';'] ], + [ KeyEvent.DOM_VK_EQUALS, ['='] ], + [ KeyEvent.DOM_VK_A, ['a'] ], + [ KeyEvent.DOM_VK_B, ['b'] ], + [ KeyEvent.DOM_VK_C, ['c'] ], + [ KeyEvent.DOM_VK_D, ['d'] ], + [ KeyEvent.DOM_VK_E, ['e'] ], + [ KeyEvent.DOM_VK_F, ['f'] ], + [ KeyEvent.DOM_VK_G, ['g'] ], + [ KeyEvent.DOM_VK_H, ['h'] ], + [ KeyEvent.DOM_VK_I, ['i'] ], + [ KeyEvent.DOM_VK_J, ['j'] ], + [ KeyEvent.DOM_VK_K, ['k'] ], + [ KeyEvent.DOM_VK_L, ['l'] ], + [ KeyEvent.DOM_VK_M, ['m'] ], + [ KeyEvent.DOM_VK_N, ['n'] ], + [ KeyEvent.DOM_VK_O, ['o'] ], + [ KeyEvent.DOM_VK_P, ['p'] ], + [ KeyEvent.DOM_VK_Q, ['q'] ], + [ KeyEvent.DOM_VK_R, ['r'] ], + [ KeyEvent.DOM_VK_S, ['s'] ], + [ KeyEvent.DOM_VK_T, ['t'] ], + [ KeyEvent.DOM_VK_U, ['u'] ], + [ KeyEvent.DOM_VK_V, ['v'] ], + [ KeyEvent.DOM_VK_W, ['w'] ], + [ KeyEvent.DOM_VK_X, ['x'] ], + [ KeyEvent.DOM_VK_Y, ['y'] ], + [ KeyEvent.DOM_VK_Z, ['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_BACK_QUOTE, ['`'] ], + [ KeyEvent.DOM_VK_OPEN_BRACKET, ['{'] ], + [ KeyEvent.DOM_VK_BACK_SLASH, ['\\'] ], + [ KeyEvent.DOM_VK_CLOSE_BRACKET, ['}'] ], + [ KeyEvent.DOM_VK_QUOTE, ["'"] ], +]; + +function getKeyCode(str, vkey) { + str = str.toLowerCase(); + var ret = 0; + (vkey ? vkeyTable : keyTable).some(function(i) i[1].some(function(k) k.toLowerCase() == str && (ret = i[0]))); + return ret; +} +function init(keys, useVkey){ + destroy(); + keys.forEach(function(key){ + var origKey, feedKey; + if (key instanceof Array){ + [origKey, feedKey] = key; + } else if (typeof(key) == 'string'){ + [origKey, feedKey] = [key,key]; + } + replaceUserMap(origKey, feedKey, useVkey); + }); +} +function replaceUserMap(origKey, feedKey, useVkey){ + if (mappings.hasMap(modes.NORMAL, origKey)){ + var origMap = mappings.get(modes.NORMAL,origKey); + if (origMap.description.indexOf(origKey+' -> ') != 0) { + // origMapをそのままpushするとオブジェクト内の参照先を消されてしまう + // 仕方なく複製を試みる + var clone = new Map(origMap.modes.map(function(m) m), + origMap.names.map(function(n) n), + origMap.description, + origMap.action, + { flags:origMap.flags, rhs:origMap.rhs, noremap:origMap.noremap }); + origMaps.push(clone); + } + } + var map = new Map([modes.NORMAL], [origKey], origKey + ' -> ' + feedKey, + function(count){ + count = count > 1 ? count : 1; + for (var i=0; i 0){ + var frames = []; + (function(frame){// @see liberator.buffer.shiftFrameFocus + if (frame.document.body.localName.toLowerCase() == 'body') { + frames.push(frame); + } + for (var i=0; i]+)/); + if (matches) { + if (matches[1]) { + ctrl = /[cC]-/.test(matches[1]); + alt = /[aA]-/.test(matches[1]); + shift = /[sS]-/.test(matches[1]); + meta = /[mM]-/.test(matches[1]); + } + if (matches[2].length == 1) { + if (!ctrl && !alt && !shift && !meta) return false; + if (useVkey && (keyCode = getKeyCode(matches[2], true))) { + charCode = 0; + } else { + charCode = matches[2].charCodeAt(0); + } + } else if (matches[2].toLowerCase() == "space") { + if (useVkey) { + charCode = 0; + keyCode = KeyEvent.DOM_VK_SPACE; + } else { + charCode = KeyEvent.DOM_VK_SPACE; + } + } else if (keyCode = getKeyCode(matches[2])) { + charCode = 0; + } else { + return false; + } + i += matches[0].length + 1; + } + } else { + shift = (keys[i] >= "A" && keys[i] <= "Z"); + } + + //liberator.log({ctrl:ctrl, alt:alt, shift:shift, meta:meta, keyCode:keyCode, charCode:charCode, useVkey: useVkey}); + var evt = content.document.createEvent('KeyEvents'); + evt.initKeyEvent('keypress', true, true, content, ctrl, alt, shift, meta, keyCode, charCode); + destElem.document.dispatchEvent(evt); + } + modes.passAllKeys = false; +} + +// -------------------------- +// Command +// -------------------------- +commands.addUserCommand(['feedmap','fmap'],'Feed Map a key sequence', + function(args, bang){ + if(!args.string){ + liberator.echo(template.table("feedmap list",feedMaps.map(function(map) [map.names[0], map.rhs])), true); + return; + } + if (bang) destroy(); + var depth = args["-depth"] ? args["-depth"] : ""; + var useVkey = "-vkey" in args; + + args.arguments.forEach(function(keypair){ + var [lhs, rhs] = keypair.split(","); + if (!rhs) rhs = lhs; + replaceUserMap(lhs, depth + rhs, useVkey); + }); + },{ + bang: true, + argCount: "*", + options: [ + [["-depth","-d"], commands.OPTION_INT], + [["-vkey","-v"], commands.OPTION_NOARG] + ] + } +); +commands.addUserCommand(['feedmapclear','fmapc'],'Clear Feed Maps',destroy); +var converter = { + get origMap() origMaps, + get feedMap() feedMaps, + setup: init, + reset: destroy +}; +return converter; +})(); +// vim: fdm=marker sw=4 ts=4 et: -- cgit v1.2.3