徹底的なキーバインドのカスタマイズとその解説

２年ほど続けていたキーバインドのカスタマイズが安定したので解説します。

私の環境は 英語配列, QWERTY 配列, Windows, 雑食（Eclipse, Visual Studio, Sublime Text, Emacs）です。
一応キーボード・OS・開発環境を問わず読めると思います。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/19593/efd6d04c-12ed-901d-9ba4-0c41cdde1990.png)

## 基本方針

#### ホームポジションを保持する
指の動きが減り疲れにくくなるので、ホームポジションから遠いキーにはショートカットを割り当てます。

#### マウス操作を減らす
キーボードとマウスの往復は最大の敵なので代わりにキーボードで操作できるようにします。

#### キーバインドを両手で押すようにする
片手だけで修飾キーとアルファベットの両方を押すと無理な力がかかるのでやめます。
そのため修飾キーを左右両方に押しやすいよう配置します。

#### キーロガーを使う
このキーは何回押されているから・あのキーより押されているからといった定量的な判断が強いです。
参考までに私のキーログを公開しましたので Firefox か Chrome で見れます。 [kaisekey - キー入力を解析します](http://hakomo.github.io/kaisekey/) 

## 修飾キー

#### CapsLock キーと Enter キーに Ctrl キーを割り当てる

本カスタマイズは Ctrl キーを使ったショートカットに依存しており、デフォルトの Ctrl キー配置だと Emacs 小指になります。
なので押しやすくほぼ左右対称な CapsLock キーと Enter キーに思い切って割り当てます。

これは CapsLock キーだけに Ctrl キーを割り当てるよりも、 Ctrl キーを使ったショートカットが劇的に押しやすくなるためおすすめです。
押せなくなった Enter キーは後ほどケアします。

#### Space キーに Shift キーを割り当てる（ SandS ）

Windows キーと他のキーを同時に押すとショートカットが実行されます。
また Windows キーだけを押して離す（ワンショットする）とスタートメニューが表示されます。
このような普通のキーと修飾キー（モディファイヤキー）の性質を合わせ持ったキーをワンショットモディファイヤと呼びます。

そして他のキーをワンショットモディファイヤにするカスタマイズで有名かつ実用的なものとして Space and Shift ( SandS ) があります。
SandS は Space キーだけを押して離すと Space キーが入力され、 Space キーと他のキーを同時に押すと Shift キーと他のキーが同時に押されたとみなされアルファベットの大文字などが入力されます。

１０前後のキーを担当する小指で Shift キーを入力するよりも、常に Space キーの上にある親指で Shift キーを入力したほうが楽なので SandS を適用します。
しかし本当の狙いは、使われなくなった元々の Shift キーに自由な割り当てをすることにあり。

#### 元々の Shift キーに Alt キーを割り当てる

Shift キーがより押しやすい Space キーにお引っ越ししたことで元々の Shift キーが空きました。
待ってましたと元々の Shift キーに Shift キーの次によく使う修飾キーである Alt キーを割り当て Alt キーを押しやすくします。

これでホームポジションを崩して左手の親指と中指で押していた Alt + Tab をホームポジションを崩さず両手で押せるようになりました。

またマウス操作を減らすためには、今までマウスでクリックしていたツールボタンやメニューコマンドをキーボードで実行する必要がありますが、それらのすべてにショートカットを割り当てることには限界があります。
つまり頻度の低いコマンドを Alt + アルファベットを起点にキーボードで実行することになるので、 Alt キーを押しやすくしたことがここで効いてきます。

#### 元々の Shift キーをワンショットしたらランチャを起動する

元々の Shift キーに Alt キーを割り当てましたが、私は Alt キーのデフォルトのワンショットを使いません。
もったいないので Alt キーをワンショットしたらランチャが起動するようにします。

ランチャというのは様々なアクションの起点になるものですから空気のようであるほど良いです。
そのため自作のランチャと合わせてキー入力が最小になるようこのようにしました。

## ホームポジションから遠いもの

Esc, F1 ~ F12, Backspace, Enter, アプリケーションキー（メニューキー）, Delete, Home, End, 方向キー, 半角/全角, Alt + F4, Win + 方向キー
これらは使う頻度が高いにもかかわらず遠いと私は考えます。

基本 Ctrl + アルファベットに割り当てて入力しやすくします。
ただし使う頻度が中途半端に高くショートカットは割り当てたいけど貴重な Ctrl + アルファベットを汚すほどでもないものには Ctrl + Shift + アルファベットを割り当てます。

Ctrl + Shift + アルファベットって入力しにくくない？と思われるかもしれませんが Ctrl キーも Shift キーも押しやすく変更しているので、一切カスタマイズ無しの Ctrl + アルファベットなどよりもよっぽど入力しやすいです。

#### Ctrl + JKL; に方向キーを割り当てる

方向キーはキーボード上で最も使うためホームポジションのど真ん中に割り当てます。
Vim の hjkl や FPS の wasd に比べて１つの方向キーに１本の指が対応しているため速いです。

|カスタマイズ前|カスタマイズ後|
|---|---|
|←|Ctrl + J|
|↓|Ctrl + K|
|↑|Ctrl + L|
|→|Ctrl + ;|
|Shift + ←|Ctrl + Shift + J|
|Shift + ↓|Ctrl + Shift + K|
|Shift + ↑|Ctrl + Shift + L|
|Shift + →|Ctrl + Shift + ;|

#### Emacs ライク

Emacs のキーバインドに似せてあります。
既存のアプリケーションとの衝突を減らしたり、カスタマイズに慣れやすくする（どの口が言う）メリットが期待できるものの、人間工学的に合理的な理由があるのならば割り当て直すべきです。

|カスタマイズ前|カスタマイズ後|
|---|---|
|Esc|Ctrl + G|
|Home|Ctrl + A|
|Shift + Home|Ctrl + Shift + A|
|End|Ctrl + E|
|Shift + End|Ctrl + Shift + E|
|Enter|Ctrl + M|
|Shift + Enter|Ctrl + Shift + M|
|Backspace|Ctrl + H|

#### Ctrl + 数字キーにファンクションキーを割り当てる

Ctrl キーと数字キーを押すぐらいなら普通にファンクションキーを押せばよくね？そう思っていた時期が私にもありました。
ひとたび慣れるとファンクションキーまで指を伸ばすのが億劫になります。

|カスタマイズ前|カスタマイズ後|
|---|---|
|F1 ~ F10|Ctrl + 1 ~ 0|
|F11|Ctrl + -|
|F12|Ctrl + =|

#### Alt + JKL; に Win + 方向キーを割り当てる

Ctrl, Shift, Alt キーは押しやすいよう再配置しましたが Windows キーはそうはしません。
なぜなら私は Windows キーを使ったショートカットをほとんど使っていなかったからです。
なので唯一使う Windows + 方向キーを別の修飾キーである Alt キーに割り当てます。

|カスタマイズ前|カスタマイズ後|
|---|---|
|Win + ←|Alt + J|
|Win + ↓|Alt + K|
|Win + ↑|Alt + L|
|Win + →|Alt + ;|

#### その他

半角/全角キーが押される前後で押されやすいキーとしては、変換候補の選択や決定などの方向キー（ Ctrl + JKL; ）やエンターキー（ Ctrl + M ）が考えられます。
これらはすべて右手でアルファベットを押すショートカットであり、したがって半角/全角キーもまた右手でアルファベットを押すように揃えると楽なので Ctrl + U に割り当てます。

アプリケーションキーはコンテキストメニュー（右クリックしたときに表示されるメニュー）を表示します。
これを要所要所で使えるとマウス操作をぐっと減らせます。

|カスタマイズ前|カスタマイズ後|
|---|---|
|半角/全角|Ctrl + U|
|Apps|Ctrl + Shift + U|
|Alt + F4|Ctrl + Shift + G|
|Delete|Ctrl + Shift + H|

## 設定

私の環境は HHKB Professional Type-S 英語配列, Windows, yamy ( 窓使いの憂鬱 ) なのでそれ以外の環境では設定をいじる必要があります。

```my.mayu
include '104.mayu'

mod control += !Enter

mod shift = !!Space
key R-*Space = &Ignore

mod alt += !!LeftShift !!E0RightShift
key R-*LeftShift = &Ignore
key R-*E0RightShift = &Ignore

key *LeftShift = &ShellExecute(, '..\\launcher', , , ShowNormal)
key *E0RightShift = &ShellExecute(, '..\\launcher', , , ShowNormal)

key *Escape = *BackQuote
key *Delete = *BackSlash

key C-G = Escape
key C-S-G = &ShellExecute(, '..\\closeforewin', , , ShowNormal)
key C-*IC-*J = ~C-*Left
key C-*K = ~C-*Down
key C-IC-K = Space
key C-*IC-*L = ~C-*Up
key C-*IC-*Semicolon = ~C-*Right
key C-*A = ~C-*Home
key C-A-A = C-A
key C-*E = ~C-*End
key C-*I = ~C-*Tab
key C-*M = ~C-*Enter
key C-H = BackSpace
key C-S-H = Delete
key C-U = A-BackQuote
key C-S-U = Apps

key C-*_1 = ~C-*F1
key C-*_2 = ~C-*F2
key C-*_3 = ~C-*F3
key C-*_4 = ~C-*F4
key C-*_5 = ~C-*F5
key C-*_6 = ~C-*F6
key C-*_7 = ~C-*F7
key C-*_8 = ~C-*F8
key C-*_9 = ~C-*F9
key C-*_0 = ~C-*F10
key C-*Minus = ~C-*F11
key C-*Equal = ~C-*F12

key A-J = W-Left
key A-K = W-Down
key A-*L = ~A-W-*Up
key A-Semicolon = W-Right
```