AHK 八倒記 (3)
前回のつづき。
AutoHotkey で新たなワンショットモディファイヤを作る件。結局、モディファイヤとして使われたかどうかを記憶するフラグを自前で用意してごにょごにょした。状態変数 mod1 に3ビットの情報を持たせているのがトリッキーなところ。どう考えてもスマートな実装とは思えないので、識者の意見を求む。
#NoEnv #SingleInstance force #UseHook mod1 = 0 ; Space+Colon を PageDown にする *sc028:: modify("{sc028}", "{PgDn}") ; Colon *sc028 up:: unmodify() ; 他にもあれば同様に、キー1個につき上の2行を書く。 *Space:: mod1 |= 2 tooltip % "mod1 = " . mod1 return *Space up:: if (mod1 & 1 == 0) { send {blind}{Space} } mod1 &= 5 if (mod1 & 4 == 0) { mod1 := 0 } tooltip % "mod1 = " . mod1 return modify(key0, key1) { global mod1 if (mod1 & 2) { mod1 |= 5 send {blind}%key1% } else if (mod1 == 0) { send {blind}%key0% } tooltip % "mod1 = " . mod1 } unmodify() { global mod1 mod1 &= 3 if (mod1 & 2 == 0) { mod1 := 0 } tooltip % "mod1 = " . mod1 } ~Esc:: tooltip ; ツールチップを消す
この実装は 要求仕様 を満たし、なおかつ半分ロールオーバーに対応している。
- Space を先に押し始めた場合はワンショットモディファイヤになる。 Space と Colon を両方押している間は PageDown がリピート入力され、離した時点では何も起きない。
- Colon を先に押し始めた場合はロールオーバーする。 Space と Colon を両方押した時点で Colon のリピートが止まり、 Space を離した時点で Space が入力される。
タイムチャートを描くと:
- Space down, Colon down, Colon up, Space up の順に操作した場合
▼ユーザの操作 Space  ̄↓___________↑ ̄ Colon  ̄ ̄ ̄↓_______↑ ̄ ̄ ̄ ▼マシンへの入力 PgDn  ̄ ̄ ̄↓_↓↓↓↓↓↓↑ ̄ ̄ ̄
- Space down, Colon down, Space up, Colon up の順に操作した場合
▼ユーザの操作 Space  ̄↓_________↑ ̄ ̄ ̄ Colon  ̄ ̄ ̄↓_________↑ ̄ ▼マシンへの入力 PgDn  ̄ ̄ ̄↓_↓↓↓↓↓↓↑ ̄ ̄ ̄
- Colon down, Space down, Colon up, Space up の順に操作した場合
▼ユーザの操作 Space  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄↓___↑ ̄ ̄ Colon  ̄↓________↑ ̄ ̄ ̄ ̄ ▼マシンへの入力 Colon  ̄↓_↓↓↓↓↓↑ ̄ ̄ ̄ ̄ ̄ ̄ Space  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄↓↑ ̄
- Colon down, Space down, Space up, Colon up の順に操作した場合
▼ユーザの操作 Space  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄↓_↑ ̄ ̄ ̄ ̄ Colon  ̄↓___________↑ ̄ ▼マシンへの入力 Colon  ̄↓_↓↓↓↓↓↑ ̄ ̄ ̄ ̄ ̄ ̄ Space  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄↓↑ ̄ ̄ ̄
半分とはいえ Space キーがロールオーバーに対応していれば 英文入力時の不都合 も軽減されるんじゃないかと期待するが、はてさて。