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