キーカスタマイズソフト 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 と順に押すことでメモ帳が起動する。フォルダ構造の奥深くに隠したアプリをショートカットを作らずに起動するために使えるかな?