## 経緯
左小指の負担を少しでも減らすため、スペースの2つ右のキーを『Shift』にしたい。
![[Pasted image 20231031220859.png]]
しかし、今はここの『ESC』を割り当てており、それを上書きしてしまうと[[Vim]]をはじめとしたモードを持つツールで不便になってしまう。そのため、はじめは『Shift』を1つ右の『Opt Alt R』に割り当てていたが、右親指を結構曲げる必要があるためあまり望ましくない。
一方、以下の特性があることに気づいた。
- 『Shift』は単体で押すことがほぼない
- [[AutoHotkeyの押しっぱなし問題]]から復帰するときくらい
- 『ESC』は他のキーと同時押しすることがほぼない
なので、以下の戦略が可能になる。
- 『Shift』を単体で押すと『ESC』になる
- 『Shift』を他のキーと同時押しすると通常の挙動になる
[[🦉Spinal reflex bindings template]]で『Ctrl』に対して似たようなことをやったことがあるので、できそうな気がしている。
## 調査
[[🦉Spinal reflex bindings template]]で『Ctrl』の実装を見てみる。
```autohotkey
$Ctrl::
if (isSecondKey()) {
MoveCenterInActiveWindow()
} else {
MouseGetPos, , , hWindow
WinActivate, ahk_id %hWindow%
FlashWindow()
}
return
```
普通に行けそう。ちなみに『ESC』もある。
```autohotkey
$ESC::
send {ESC}
setIME(false)
setMode(_MODE.NORMAL)
return
```
[[AutoHotkey]]としては、`$ESC`と同じ実装を『Ctrl』単押しに対して行えば良さそう。
```autohotkey
$Shift::
; 『ESC』と同じ
send {ESC}
setIME(false)
setMode(_MODE.NORMAL)
return
```
## 欠点
設定前は『ESC』がkey down時に発動したが、設定後は『ESC』がkey up時に発動するようになってしまった。同時押し判定待ちなのでそれはそう。
一件大したことがないように見えるが、これが意味する違いは大きい。[[Vim]]のキーバインドを用いる操作では、『ESC』と[[ノーマルモード]]のコマンドを連続して打つことが多く、後に打ったコマンドが『Shift』との同時押しとみなされてしまう。これはスピードが求められる文章入力時には致命的なラグだ。
==最終的に、このキーマップは断念した。==