keyhac で Emacs 風ショートカットを定義する


キーカスタマイズソフト keyhac において、“複数のキー入力へアクションを割り当てる”ことが可能になっていた。要するにこれは、Emacs 風のショートカットを実現するためのものだ。

from keyhac import *

def configure( km ):
    # グローバルキーマップ
    kmg = km.defineWindowKeymap()

    # “切り取り”は C-W に退避させておく
    kmg[ "C-W" ] = "C-X"

    # マルチストローク設定
    kmg[ "C-X" ] = km.defineMultiStrokeKeymap()
    # 開く
    kmg[ "C-X" ][ "C-F" ] = "C-O"
    # 上書き保存
    kmg[ "C-X" ][ "C-S" ] = "C-S"
    # 名前をつけて保存
    kmg[ "C-X" ][ "C-W" ] = "A-F", "A"
    # 終了
    kmg[ "C-X" ][ "C-C" ] = "A-F4"

これにより、Control を押下したまま、XC と順に叩いてウィンドウを閉じることができる。さらに応用として、

from keyhac import *

def configure( km ):
    # グローバルキーマップ
    kmg = km.defineWindowKeymap()

    # マルチストローク設定
    kmg[ "C-Q" ] = km.defineMultiStrokeKeymap()
    kmg[ "C-Q" ][ "C-U" ] = km.defineMultiStrokeKeymap()
    kmg[ "C-Q" ][ "C-U" ][ "C-I" ] = km.defineMultiStrokeKeymap()
    kmg[ "C-Q" ][ "C-U" ][ "C-I" ][ "C-T" ] = "A-F4"

Control を押下したまま、QUIT と 4 つのキーを押すような組み合わせをも指定できる。

押すキーが長くなると config.py の記述が煩雑になるのでちょっとした関数を書いてみた。

from keyhac import *

# マルチストローク設定
def set_multistroke( km, command, func, modifier = "C" ):
    # ショートカット
    kmg = km.defineWindowKeymap()

    def set_default( d, i, value = km.defineMultiStrokeKeymap() ):
        def make_key( s ):
            return modifier + "-" + command[ s ]
        try:
            d[ make_key( i ) ]
        except:
            d[ make_key( i ) ] = value
        return d[ make_key( i ) ]

    for i in xrange( len( command ) ):
        if i == 0:
            km_ms = set_default( kmg, 0 )
        elif i < len( command ) - 1:
            km_ms = set_default( km_ms, i )
        else:
            set_default( km_ms, -1, func )

def configure( km ):
    set_multistroke( km, "XF", "C-O" )
    set_multistroke( km, "XS", "C-S" )
    set_multistroke( km, "XW", ( "A-F", "A" ) )
    set_multistroke( km, "XC", "A-F4" )
    set_multistroke( km, "QUIT", "A-F4" )
    set_multistroke( km, "STARTNOTEPAD",
        km.command_ShellExecute( None, None, "notepad.exe", u"", u"" )

最後の例では、Control を押下したまま STARTNOTEPAD と順に押すことでメモ帳が起動する。フォルダ構造の奥深くに隠したアプリをショートカットを作らずに起動するために使えるかな?

コメントを残す