keyhac で親指徹底活用

私の目標は keyhacPhase14e と同様のカスタマイズを実現することだ。

キモは Space キーをワンショットモディファイアとして機能キーを文字キーに重ね合わせるところにある。たとえば Space+[ 1 ] を押したら [F1] が、Space+[ ; ] を押したら [End] が入力されるようにしたい。keyhac で SandS の例に倣えば次のような定義が書ける。

# config.py
from keyhac import *

def configure(keymap):
	keymap_global = keymap.defineWindowKeymap()
	keymap.defineModifier("Space", "User1")
	
	keymap_global["O-Space"] = "Space"
	keymap_global["U1-1"   ] = "F1"

簡単だ。これで Space+[ 1 ] を押せば [F1] になる。しかし、Space+Ctrl+[ 1 ] を押しても Ctrl+[F1] にはならない。keyhac ではこのように無関係なモディファイアを透過させることはできない。もし透過させたければすべてのモディファイアの組合せを書き下す必要がある。えっ、Shift と Ctrl と Alt と Win の組合せ = 16 通り!? \(^o^)/
いやいや、そんなバカな。keyhac の定義ファイルは python スクリプトなんだから、次のようにループを使って書けばいい。*1

# config.py
from keyhac import *

def configure(keymap):
	keymap_global = keymap.defineWindowKeymap()
	keymap.defineModifier("Space", "User1")
	
	for any in ("", "S-", "C-", "C-S-", "A-", "A-S-", "A-C-", "A-C-S-", "W-", "W-S-", "W-C-", "W-C-S-", "W-A-", "W-A-S-", "W-A-C-", "W-A-C-S-"):
		keymap_global[any + "O-Space"] = any + "Space"
		keymap_global[any + "U1-1"   ] = any + "F1"

ちなみに、同じことを窓使いの憂鬱でやるとこんな感じ。モディファイアの透過は * で指定できる。

mod Mod0  += !!Space
def subst *Space = *Space
def subst M0-*_1 = ~M0-*F1

同じことを AutoHotkey でやるとこんな感じ。別途 OneshotModifier_Space.ahk が必要。モディファイアの透過は {blind} で指定できる。

gosub OM_Init
return

#Include OneshotModifier_Space.ahk

$*sc002:: OM_Modify("{blind}{sc002}", "{blind}{F1}")
~$*sc002 up:: OM_Unmodify()

*1:このアイディアは keyhac の作者さんにご教示いただきました。ありがとうございます。