AHK 八倒記 (2)

昨日の続き

やりたいこと (1) :少し詳しく

親指 + 文字キー を 機能キー に割り当てたい。たとえば「Space+コロン = PageDown」と定義したら次のように動作させたい。タイムチャートの「↓」は down イベントを、「↑」は up イベントを表す。

  • Space だけを押して離すと Space が入力される(リピートしない)。
 ▼ユーザの操作
 Space  ̄↓_↑ ̄ ̄ ̄
 
 ▼マシンへの入力
 Space  ̄ ̄ ̄↓↑ ̄ ̄
  • Shift を押しながら Space を押して離すと Shift+Space が入力される(リピートしない)。
 ▼ユーザの操作
 Shift  ̄↓______↑ ̄
 
 Space  ̄ ̄ ̄↓_↑ ̄ ̄ ̄ ̄
 
 ▼マシンへの入力
 Shift  ̄↓______↑ ̄
 
 Space  ̄ ̄ ̄ ̄ ̄↓↑ ̄ ̄ ̄
  • Space を押しながら コロン を押すと PageDown が入力される(リピートする)。その後 Space を離したときは何も起きない。
 ▼ユーザの操作
 Space  ̄↓___________↑ ̄
 
 Colon  ̄ ̄ ̄↓_______↑ ̄ ̄ ̄
 
 ▼マシンへの入力
 PgDn   ̄ ̄ ̄↓_↓↓↓↓↓↓↑ ̄ ̄ ̄
  • Shift と Space を押しながら コロン を押すと Shift+PageDown が入力される(リピートする)。その後 Space を離したときは何も起きない。
 ▼ユーザの操作
 Shift  ̄↓_______________↑ ̄
 
 Space  ̄ ̄ ̄↓___________↑ ̄ ̄ ̄
 
 Colon  ̄ ̄ ̄ ̄ ̄↓_______↑ ̄ ̄ ̄ ̄ ̄
 
 ▼マシンへの入力
 Shift  ̄↓_______________↑ ̄
 
 PgDn   ̄ ̄ ̄ ̄ ̄↓_↓↓↓↓↓↓↑ ̄ ̄ ̄ ̄ ̄
  • Shift 以外のモディファイヤ(の組合せ)に対しても同様

罠 (1-5) 他のモディファイヤを押しながらプレフィクスキーを押して離したときの処理

上記の処理を実現したくて、現在は次のように定義している。

 *Space:: Send {Blind}{Space}
 Space & sc028 :: Send {Blind}{PgDn}

これだと Shift を押しながら Space を押したとき(離す前)に Shift+Space が入力される(リピートする)。

 ▼ユーザの操作
 Shift  ̄↓___________↑ ̄
 
 Space  ̄ ̄ ̄↓_______↑ ̄ ̄ ̄
 
 ▼マシンへの入力
 Shift  ̄↓___________↑ ̄
 
 Space  ̄ ̄ ̄↓_↓↓↓↓↓↓↑ ̄ ̄ ̄

この場合は Space を離すまで何も起こらず、 Space を離した時点で Shift+Space が入力されてほしい。そこで、次のように up を付けてみた。

 *Space up:: Send {Blind}{Space}
 Space & sc028 :: Send {Blind}{PgDn}

これだと Shift を押しながら Space を押して離したときの挙動は理想的だが、 Shift → Space → コロン の順に押し始めたあと Space を離した時点で Space が入力されてしまう。

 ▼ユーザの操作
 Shift  ̄↓________________↑ ̄
 
 Space  ̄ ̄ ̄↓___________↑ ̄ ̄ ̄ ̄
 
 Colon  ̄ ̄ ̄ ̄ ̄↓_______↑ ̄ ̄ ̄ ̄ ̄ ̄
 
 ▼マシンへの入力
 Shift  ̄↓________________↑ ̄
 
 Space  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄↓↑ ̄ ̄ ̄
 
 PgDn   ̄ ̄ ̄ ̄ ̄↓_↓↓↓↓↓↓↑ ̄ ̄ ̄ ̄ ̄ ̄

この場合は Space を離した時点で何も起こらないでほしい。要するに、

  • Space がモディファイヤとして使われなかった場合は Space を離したときに Space が入力される
  • Space がモディファイヤとして使われた場合は Space を離したときに何も起こらない

という動作にしたい。となると、モディファイヤとして使われたかどうかを記憶するフラグを自前で用意してごにょごにょしなきゃならないだろうか? 識者の意見を求む。