Hook (Japanese) - mooz/keysnail GitHub Wiki

はじめãĢ

äģĨ下ãĢį¤ēã™ã‚ŗãƒŧドぎ動äŊœã‚’įĸēčĒã™ã‚‹į‚ēãĢは Eval ã‚ŗãƒžãƒŗãƒ‰ãŒåŊšãĢįĢ‹ãĄãžã™ã€‚

M-: (Alt + : ãĒお) とå…ĨåŠ›ã—ã€é–‹ã„ãŸãƒ—ãƒ­ãƒŗãƒ—ãƒˆãĢã‚ŗãƒŧãƒ‰ã‚’æ‰“ãĄčžŧãŋ Enter キãƒŧをæŠŧす。 Eval ã‚ŗãƒžãƒŗãƒ‰ã¯é–‹į™ēč€…ãŽč‰¯ãå‹ã§ã™ã€‚

čŠŗã—ã„čĒŦ明ãĢé–ĸしãĻは こぎペãƒŧジ ã‚’å‚į…§ã—ãĻください。

フックãĢついãĻ

KeySnail ãŽãƒ•ãƒƒã‚¯ã‚ˇã‚šãƒ†ãƒ ã‚’åˆŠį”¨ã™ã‚‹ã¨ã€ãƒ—ãƒ­ã‚°ãƒŠãƒ ãŽæ§˜ã€…ãĒ部分ãĢč¨­ã‘ã‚‰ã‚ŒãŸãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã¸é–ĸæ•°ã‚’å‰˛ã‚ŠåŊ“ãĻãĻおくことが可čƒŊとãĒã‚Šãžã™ã€‚ãžãŸã€ãƒ—ãƒŠã‚°ã‚¤ãƒŗãĒおがフックをį‹Ŧč‡ĒãĢį”¨æ„ã™ã‚‹ã“ã¨ã‚‚ã§ããžã™ã€‚

䞋えば KeyPress フックへé–ĸ数をį™ģéŒ˛ã™ã‚‹å ´åˆã¯ .keysnail.js ぎæœĢ尞へæŦĄãŽã‚ˆã†ãĒã‚ŗãƒŧãƒ‰ã‚’č¨˜čŋ°ã—ぞす。

hook.addToHook("KeyPress",
               function (aKey) {
                   display.prettyPrint(aKey + " pressed");
               });

こぎようãĢしãĻおくと、ãƒĻãƒŧã‚ļがキãƒŧをå…Ĩ力するåēĻãĢ display.prettyPrint(aKey + " pressed") ãŒåŽŸčĄŒã•ã‚Œã‚‹ã‚ˆã†ãĢãĒりぞす。ここではå…Ĩ力されたキãƒŧぎ名前をį”ģéĸã¸čĄ¨į¤ēしãĻいぞす。

ãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã¸ãŽé–ĸæ•°å‰˛ã‚ŠåŊ“ãĻãĢは addToHook か setHook ã‚’į”¨ã„ãžã™ã€‚ä¸Ąč€…ã¨ã‚‚å–ã‚‹åŧ•数は同じですが、 addToHook ãŒãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆãŽæœĢ尞へé–ĸ数をčŋŊ加するぎãĢ寞し、 setHook はそれぞでãĢãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã¸į™ģéŒ˛ã•ã‚ŒãŸé–ĸ数全ãĻをæļˆåŽģした垌ãĢé–ĸ数į™ģéŒ˛ã‚’čĄŒã„ãžã™ã€‚

ゆえãĢã€ãƒ—ãƒŠã‚°ã‚¤ãƒŗå†…ã§ãƒ•ãƒƒã‚¯į™ģéŒ˛ã‚’čĄŒã†å ´åˆã¯åŋ…ず addToHook をäŊŋうようãĢしãĻください。

ãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆãŽæäž›

ãƒ—ãƒŠã‚°ã‚¤ãƒŗã¯ã€ã¨ãĻã‚‚ã‚ˇãƒŗãƒ—ãƒĢãĒæ–šæŗ•ã§į‹Ŧč‡ĒãŽãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã‚’į”¨æ„ã™ã‚‹ã“ã¨ãŒå¯čƒŊです。

ãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã¨ã—ãŸã„å ´æ‰€ãĢ hook.callHook("ãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆå", åŧ•æ•°) ãŽä¸€čĄŒã‚’č¨˜čŋ°ã—ãĻ下さい。こうしãĻãŠãã“ã¨ã§ã€ããŽãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆãĢå‰˛ã‚ŠåŊ“ãĻられたé–ĸ数へåŧ•æ•°ãŒæ¸Ąã•ã‚Œã€åŽŸčĄŒã•ã‚Œãžã™ã€‚

䞋えば KeySnail 内部ぎ key ãƒĸジãƒĨãƒŧãƒĢでは、æŦĄãŽã‚ˆã†ãĢしãĻãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆãŒæäž›ã•ã‚ŒãĻいぞす。

hook.callHook("KeyBoardQuit", aEvent);
hook.callHook("PostCommand", hookArg);

こぎ䞋をčĻ‹ãĻ分かるようãĢã€å„ãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆãĢã‚ˆãŖãĻé–ĸ数ãĢæ¸Ąã•ã‚Œã‚‹åŧ•æ•°ã¯į•°ãĒりぞす。äģĨ下ãĢč¨˜ã•ã‚ŒãŸčĒŦæ˜Žã‚’å‚č€ƒãĢしãĻください。

KeyPress

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

ãƒĻãƒŧã‚ļがキãƒŧをå…Ĩ力するåēĻãĢこぎフックへį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数がå‘ŧばれぞす。

åŧ•æ•°

こぎフックへį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数ãĢは キãƒŧã‚¤ãƒ™ãƒŗãƒˆ ãŒæ¸Ąã•ã‚Œãžã™ã€‚

äŊŋį”¨äž‹

hook.addToHook("KeyPress",
               function (aKey) {
                   display.prettyPrint(key.keyEventToString(aKey) + " pressed");
               });

aKey ãĢはå…Ĩ力されたキãƒŧぎキãƒŧã‚¤ãƒ™ãƒŗãƒˆãŒæ¸Ąã‚‹ãŽã§ã€ã“ã“ã§ã¯ãã‚Œã‚’æ–‡å­—åˆ—åŊĸåŧã¸å¤‰æ›ã—、į”ģéĸã¸ã¨čĄ¨į¤ēしãĻいぞす。

KeyBoardQuit

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

ãƒĻãƒŧã‚ļが key.quitKey (デフりãƒĢトは C-g) をå…Ĩ力した際ãĢå‘ŧばれぞす。

åŧ•æ•°

こぎフックへį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数ãĢは キãƒŧã‚¤ãƒ™ãƒŗãƒˆ ãŒæ¸Ąã•ã‚Œãžã™ã€‚

äŊŋį”¨äž‹

hook.setHook('KeyBoardQuit', function (aEvent) {
    if (key.currentKeySequence.length)
        return;

    command.closeFindBar();

    if (util.isCaretEnabled())
        command.resetMark(aEvent);
    else             
        goDoCommand("cmd_selectNone");

    if (KeySnail.windowType == "navigator:browser")
        key.generateKey(aEvent.originalTarget, KeyEvent.DOM_VK_ESCAPE, true);
});

これは多くぎãƒĻãƒŧã‚ļぎ .keysnail.js へ原際ãĢ記čŋ°ã•れãĻã„ã‚‹ã§ã‚ã‚ã†č¨­åŽšã§ã™ã€‚é€šå¸¸ãŽæ–šæŗ•ã§ã¯ key.quitKey ãĢã‚ŗãƒžãƒŗãƒ‰ã‚’å‰˛ã‚ŠåŊ“ãĻることができãĒいため、こぎようãĢしãĻãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã¸ã¨ã‚ŗãƒžãƒŗãƒ‰ã‚’į™ģéŒ˛ã™ã‚‹ã“ã¨ã§ã€å¯žåŋœã—ãĻいぞす。

PreCommand, PostCommand

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

キãƒŧãĢå‰˛ã‚ŠåŊ“ãĻã‚‰ã‚ŒãŸã‚ŗãƒžãƒŗãƒ‰ãŒå‘ŧばれる前 (PreCommand) とå‘ŧばれた垌 (PostCommand) ãĢã€ã“ãŽãƒ•ãƒƒã‚¯ãƒã‚¤ãƒŗãƒˆã¸į™ģéŒ˛ã•ã‚ŒãŸé–ĸ数がå‘ŧばれぞす。

åŧ•æ•°

こぎフックへį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数ãĢはæŦĄãŽã‚ˆã†ãĒã‚Ēãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ¸Ąã•ã‚Œãžã™ã€‚

var hookArg = {
            func  : aFunc,
            event : aEvent,
            arg   : aArg
        };

func ãĢは ã‚ŗãƒžãƒŗãƒ‰æœŦäŊ“ (é–ĸ数) が、 event ãĢは キãƒŧã‚¤ãƒ™ãƒŗãƒˆ が、 arg ãĢは 前įŊŽåŧ•æ•° がそれぞれæ ŧį´ã•ã‚Œãžã™ã€‚

į‰šåˆĨãĒ動äŊœ

PreCommand ãƒ•ãƒƒã‚¯ã¸å‰˛ã‚ŠåŊ“ãĻられたé–ĸæ•°å†…ã§äž‹å¤–ã‚’æŠ•ã’ã‚‹ã¨ã€ããŽã‚ŗãƒžãƒŗãƒ‰ãŽåŽŸčĄŒã‚’ã‚­ãƒŖãƒŗã‚ģãƒĢすることが可čƒŊです。

äŊŋį”¨äž‹

hook.addToHook("PostCommand",
               function (aHookArg) {
                   var func = aHookArg.func;
                   display.prettyPrint(func.ksDescription + " executed");
               });

ここでは aHookArg.func としãĻã€Œã‚ŗãƒžãƒŗãƒ‰æœŦäŊ“」をå…Ĩæ‰‹ã—ã€ããŽã‚ŗãƒžãƒŗãƒ‰ãŽčĒŦ明を func.ksDescription としãĻåž—ãŸãŽãĄã€į”ģéĸã¸ã¨čĄ¨į¤ēしãĻいぞす。

ClipboardChanged

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

クãƒĒップボãƒŧドぎ内厚が変化したとき (ãƒĻãƒŧã‚ļãŒãƒ†ã‚­ã‚šãƒˆã‚’ã‚ŗãƒ”ãƒŧしたとき) ãĢå‘ŧばれぞす。

åŧ•æ•°

ãƒĻãƒŧã‚ļãŒã‚ŗãƒ”ãƒŧしたテキ゚トぎ内厚 ãŒæ¸Ąã‚Šãžã™ã€‚

į‰šåˆĨãĒ動äŊœ

PreCommand ãƒ•ãƒƒã‚¯ã¸å‰˛ã‚ŠåŊ“ãĻられたé–ĸ数内で䞋外を投げると、そぎテキ゚トは KeySnail ぎキãƒĢãƒĒãƒŗã‚°ã¸æ ŧį´ã•ã‚Œãžã›ã‚“ã€‚

äŊŋį”¨äž‹

hook.addToHook("ClipboardChanged",
               function (aText) {
                   util.alert("Clipboard Changed!", aText + " copied");
               });

ã“ã“ã§ã¯æ–°ã—ãã‚ŗãƒ”ãƒŧされたテキ゚トぎ内厚を、ダイã‚ĸãƒ­ã‚°čĄ¨į¤ēしãĻいぞす。

LocationChange

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

ãƒ­ã‚ąãƒŧã‚ˇãƒ§ãƒŗãƒãƒŧぎ値が変化したとき、つぞりペãƒŧジがロãƒŧドされた際やã‚ŋブが切りæ›ŋã‚ãŖãŸéš›ãĢå‘ŧばれぞす。

åŧ•æ•°

ロãƒŧドされたペãƒŧジ、切りæ›ŋã‚ãŖãŸã‚ŋブぎペãƒŧジぎ URI がæ ŧį´ã•ã‚ŒãŸã‚Ēãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ¸Ąã‚Šãžã™ã€‚

文字列としãĻぎ URL は spec ãƒ—ãƒ­ãƒ‘ãƒ†ã‚ŖãĢæ ŧį´ã•ã‚ŒãĻいぞす。

äŊŋį”¨äž‹

hook.addToHook('LocationChange', function (aNsURI) {
    if (aNsURI || aNsURI.spec) {
        var url = aNsURI.spec;

        display.prettyPrint(url);
    }
});

こぎ䞋では、ã‚ŋブが切りæ›ŋã‚ãŖãŸéš›ãĒおãĢ゚クãƒĒãƒŧãƒŗãŽåŗä¸Šã¸ããŽ URL ã‚’čĄ¨į¤ēしãĻいぞす。

GreaseMonkey ぎようãĢã€į‰šåŽšãŽã‚ĩイトãĢ寞するå‡Ļį†ã‚’čĄŒã„ãŸã„å ´åˆãĢäžŋ刊でしょう。

PluginLoaded

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

å…¨ãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽãƒ­ãƒŧドがįĩ‚ã‚ãŖãŸéš›ãĢå‘ŧばれぞす。

åŧ•æ•°

ã“ãŽãƒ•ãƒƒã‚¯ã¯į‰šãĢåŧ•æ•°ã‚’æ¸Ąã—ãžã›ã‚“ã€‚

äŊŋį”¨äž‹

ã“ãŽãƒ•ãƒƒã‚¯ã¯ãƒ—ãƒŠã‚°ã‚¤ãƒŗå†…ã§ã‹ã‚‰äģ–ãŽãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽå€¤ã‚’åˆŠį”¨ã—ãŸã‚Šã€ä¸Šæ›¸ãã™ã‚‹éš›ãĢæœ‰į”¨ã§ã™ã€‚

KeySnail はæŦĄãŽã‚ˆã†ãĒ順į•Ēã§ãƒ—ãƒŠã‚°ã‚¤ãƒŗã‚’ãƒ­ãƒŧドしぞす。

  1. 名前が _ ã§å§‹ãžã‚‹ãƒ—ãƒŠã‚°ã‚¤ãƒŗ (ナイブナãƒĒ)
  2. åˆæœŸåŒ–ãƒ•ã‚Ąã‚¤ãƒĢ (.keysnail.js)
  3. å„ãƒ—ãƒŠã‚°ã‚¤ãƒŗã‚’åå‰é †ãĢロãƒŧド

そぎį‚ē、フェãƒŧã‚ē 3 ãŽã€Œå„ãƒ—ãƒŠã‚°ã‚¤ãƒŗã€å†…ã§äģ–ãŽãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽå€¤ã‚’åˆŠį”¨ã—ãŸã‚Šä¸Šæ›¸ãã—ã‚ˆã†ã¨ã™ã‚‹ã¨ã€å¯žčąĄã¨ãĒã‚‹ãƒ—ãƒŠã‚°ã‚¤ãƒŗãŒããŽãƒ—ãƒŠã‚°ã‚¤ãƒŗã‚ˆã‚Šå…ˆãĢロãƒŧドされãĻいるäŋč¨ŧがãĒいため (ã‚‚ãĄã‚ã‚“åå‰ã‚’å¤‰æ›´ã™ã‚‹ã“ã¨ã§é †į•Ēを操äŊœã™ã‚‹ã“とは可čƒŊですが) うぞくいきぞせん。

ここで PluginLoaded フックぎå‡ēį•Ēです。こぎフックへį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数は、先ãģおぎãƒĒ゚トでいうとæŦĄãŽã‚ˆã†ãĒäŊįŊŽã§å‘ŧばれぞす。

  1. 名前が _ ã§å§‹ãžã‚‹ãƒ—ãƒŠã‚°ã‚¤ãƒŗ (ナイブナãƒĒ)
  2. åˆæœŸåŒ–ãƒ•ã‚Ąã‚¤ãƒĢ (.keysnail.js)
  3. å„ãƒ—ãƒŠã‚°ã‚¤ãƒŗã‚’åå‰é †ãĢロãƒŧド
  4. PluginLoaded ãĢį™ģéŒ˛ã•ã‚ŒãŸé–ĸæ•°ãŽåŽŸčĄŒ

PluginLoaded ãĢį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数がå‘ŧã°ã‚Œã‚‹æ™‚į‚šã§ã¯å„ãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽãƒ­ãƒŧドがįĩ‚ã‚ãŖãĻいるため、厉åŋƒã—ãĻãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽå€¤ã‚’äŊŋį”¨ã—ãŸã‚Šå¤‰æ›´ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒå‡ēæĨるというわけです。

䞋えば Caret hint ãƒ—ãƒŠã‚°ã‚¤ãƒŗã§ã¯ HoK ãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽæ‹Ąåŧĩãƒ’ãƒŗãƒˆãƒĸãƒŧドã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŽå€¤ã‚’ä¸Šæ›¸ãã™ã‚‹į‚ēãĢ、こぎフックへé–ĸ数をį™ģéŒ˛ã—ãĻいぞす。

hook.addToHook('PluginLoaded', function () {
    if (!plugins.hok)
        return;

    var actions = [
        [headMode, M({ja: "ã‚­ãƒŖãƒŦットをčĻį´ ãŽå…ˆé ­ã¸į§ģ動", en: "Move caret to the head of the selected element"}),
         function (e) moveCaret(e, true, false)],
        [tailMode, M({ja: "ã‚­ãƒŖãƒŦットをčĻį´ ãŽæœĢ尞へį§ģ動", en: "Move caret to the tail of the selected element"}),
         function (e) moveCaret(e, false, false)],
        [selectHeadMode, M({ja: "čĻį´ ã‚’é¸æŠžã—ãĻã‚­ãƒŖãƒŦットを先頭へį§ģ動", en: "Select element and move caret to the head"}),
         function (e) moveCaret(e, false, true)],
        [selectTailMode, M({ja: "čĻį´ ã‚’é¸æŠžã—ãĻã‚­ãƒŖãƒŦットをæœĢ尞へį§ģ動", en: "Select element and move caret to the tail"}),
         function (e) moveCaret(e, false, true)]
    ];
// äģĨä¸‹įœį•Ĩ

Unload

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

Firefox ãŽãƒĄã‚¤ãƒŗã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļが閉じられる際ãĢå‘ŧばれぞす。

åŧ•æ•°

ã“ãŽãƒ•ãƒƒã‚¯ã¯į‰šãĢåŧ•æ•°ã‚’æ¸Ąã—ãžã›ã‚“ã€‚

äŊŋį”¨äž‹

こぎフックãĢį™ģéŒ˛ã•ã‚ŒãŸé–ĸ数はデ゚トナクã‚ŋぎようãĢæŒ¯ã‚‹čˆžãŖãĻãã‚Œãžã™ã€‚ãƒ—ãƒŠã‚°ã‚¤ãƒŗãŽåžŒå‡ĻᐆãĒãŠã‚’čĄŒã„ãŸã„å ´åˆãĢäžŋ刊でしょう。

バãƒŧã‚¸ãƒ§ãƒŗ

Unload フックは KeySnail 1.1.8 ã‹ã‚‰į”¨æ„ã•ã‚ŒãĻいぞす。

KeySnailInitialized

å‘ŧばれるã‚ŋã‚¤ãƒŸãƒŗã‚°

KeySnail ぎ初期化がįĩ‚äē†ã—た際ãĢå‘ŧばれぞす。

åŧ•æ•°

į‰šãĢåŧ•æ•°ã‚’æ¸Ąã—ãžã›ã‚“ã€‚

バãƒŧã‚¸ãƒ§ãƒŗ

Unload フックは KeySnail 1.3.2 ã‹ã‚‰į”¨æ„ã•ã‚ŒãĻいぞす。

âš ī¸ **GitHub.com Fallback** âš ī¸