Windowsの日本語キーボードを、ちょっとだけチューニング（英数・かなキーとEmacsキーバインド）したMacと同じ使用感にする

## サマリー

Google日本語入力, Change Key, AutoHotKey を使って Windows のキーボードの設定を自分好みにしました。

## 何をしたいか
ここ数年はWindowsに触れない生活をしていたのですが、ちょっとした事情で新しいWindows（ゲーム機）が手元に届きました。それまでは自宅でも会社でもMacを使っていたため、Windowsのキーボードが使いづらくて仕方ありません。そこで、Windowsのキーボード設定をいじって、使い慣れているMacのキーボードの感じに可能な限り近づけます。

## そもそもMacはどうなっているのか
使っているMacはUSキーボードです。Mac側のキーボードで重要なチューニングは主に以下の3点です。

- 右Commandで日本語入力 / 左Commandで英数入力 になるようにする
- CapsLockをControlにする
- Controlキーを使ったEmacsの基本的なキーバインドが使える

これらは全て [Karabiner](https://pqrs.org/osx/karabiner/) (Karabinar-Elements) を使って実現しています。
Mac側の設定は本記事の主題ではないのでKarabinerの説明などは省きますが、 Karabiner-Elements の Simple modifications, Complex modifications に少し設定を加えるだけでこの状態にできます。
<img width="1016" alt="スクリーンショット 2019-12-03 22.34.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192925/5838d886-73a5-3a04-055f-e6edc1c9910a.png">
<img width="1016" alt="スクリーンショット 2019-12-03 22.35.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192925/a707ae0b-f3e4-5db0-55a6-8b266e0f3096.png">

ご覧の通り、そこまでこだわったキーボード設定ではないです。もうゴリゴリに設定している人には物足りないと思いますが、Karabinerの存在すら知らなかった人には一度試してみてほしいシンプル構成です。

## Windowsをいじる
### IMEのオンオフ
まずはMacの「右Commandで日本語入力、左Commandで英数入力になる」という挙動を再現します。MacのUSキーボードのコマンドキーはスペースキーの左右にひとつずつありますが、僕の使っているWindowsのキーボードでは、この親指で極めてアクセスしやすい一等地に変換/無変換という何に使うのかわからないキーが我が物顔で陣取っています[^1]。

[^1]: その処理スペースキーでできるのになんでお前らそんなとこにおんの？

これの左側である無変換キーでIMEをオフに、また右側である変換キーでひらがな入力に切り替わってほしいので、これはGoogle日本語入力側で設定します。詳細は [Google日本語入力でIME ON/OFFを変換・無変換キーに割り当てる【ver 2.0】](https://www.teradas.net/archives/2927/) をご覧いただければと思いますが、ポイントは「入力文字なし」の "Henkan" を 「ひらがなに入力切替」、 "Muhenkan" を 「IMEを無効化」に設定することです。

![image__6_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192925/605fa5ce-a742-306d-02e8-843e5cfb9067.png)

### CapsLockとEmacsキーバインド
続いて、Emacsキーバインドの実現を意識しながらCapsLockの設定を変更します。左手小指のホームポジションのすぐ左という極めてアクセスしやすい一等地にありながら、いつ使うかよくわからないIMEオン状態での英数/かな切替やCapsLock機能を提供するためだけに我が物顔で陣取っているこのキーをEmacsキーバインドに有効活用できるように生まれ変わらせます[^2]。具体的には、 CapsLock + P/N/B/F/A/E/K/H/M あたりのEmacsキーバインドが正常に動作するようにします。

[^2]: 意図せずCapsLockとShiftを同時押ししてしまい、なぜか全ての英字が大文字になる現象の理由がわからず、悔しがりながらPCを再起動した、幼い頃の経験が蘇ります。

基本的な考え方は [AutoHotKey](https://www.autohotkey.com/) を使ってキーバインドを定義していくことですが、最も単純な考え方として CapsLock を直接 Control にバインドすると、 CapsLock が押しっぱなしになる現象が発生し所望の挙動になりません。その対策は [AutoHotkeyでCapsLockが押しっぱなしになる現象を解消する方法](https://wonwon-eater.com/autohotkey-capslock/) に詳しいですが、 [Change Key](https://forest.watch.impress.co.jp/library/software/changekey/) を用いて CapsLock をF13という（物理キーボードには存在しないが、内部的には定義されている）キーに割り当て、その後 F13 + Key というキーバインドを定義していくことです。

Change Key は以下のように設定します。

![image__3_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192925/13828de1-a0d1-ac14-78bd-8d532c093223.png)
設定対象としてCapsLockを選ぶ。

![image__4_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192925/b695ee48-e66b-8ca8-f843-2e4b08bf7425.png)
新しく開いた画面で `Scan Code` を選ぶ。

![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192925/533f204c-8a9e-d54b-8093-380639a2bca6.png)
新しく開いた画面で `0x0064` を入力する（F13）。

では続いて、AutoHotKeyの設定をします。AutoHotKeyのインストール後、 AutoHotKey Script の新規作成を実施し (.ahkファイルを作り、) 以下の内容で保存します。

```
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; CapsLock (F13) を Ctrl のように使い、基本的なEmacsキーバインドが動くようにする。
F13 & p::Up
F13 & b::Left
F13 & n::Down
F13 & f::Right
F13 & a::send {Home}
F13 & e::send {End}
F13 & k::send +{End}{Del}
F13 & h::send {BS}
F13 & m::send {Enter}

;!F13 & Left::send ^+{Tab}

; タスクビューの移動
; Ctrl + Win + Right/Left での画面移動を Ctrl + Left/Right でもできるようにする。
^Left::^#Left
F13 & Left::^#Left
^Right::^#Right
F13 & Right::^#Right

; 無変換 + Key を、Macでいう Command + Key (Windowsでいう Control + Key) のように使えるようにする。
vk1D::send {vk1D}
vk1D & Right::send {End}
vk1D & Left::send {Home}
vk1D & q::send ^q 
vk1D & w::send ^w 
vk1D & e::send ^e 
vk1D & r::send ^r 
vk1D & t::send ^t 
vk1D & y::send ^y 
vk1D & u::send ^u 
vk1D & i::send ^i 
vk1D & o::send ^o 
vk1D & p::send ^p 
vk1D & a::send ^a 
vk1D & s::send ^s 
vk1D & d::send ^d 
vk1D & f::send ^f 
vk1D & g::send ^g 
vk1D & h::send ^h 
vk1D & j::send ^j 
vk1D & k::send ^k 
vk1D & l::send ^l 
vk1D & z::send ^z 
vk1D & x::send ^x 
vk1D & c::send ^c 
vk1D & v::send ^v 
vk1D & b::send ^b 
vk1D & n::send ^n 
vk1D & m::send ^m 
vk1D & ,::send ^, 
vk1D & .::send ^. 
vk1D & /::send ^/ 

; 変換 + Key を、Macでいう Command + Key (Windowsでいう Control + Key) のように使えるようにする。
vk1C::send {vk1C}
vk1C & Right::send {End}
vk1C & Left::send {Home}
vk1C & q::send ^q 
vk1C & w::send ^w 
vk1C & e::send ^e 
vk1C & r::send ^r 
vk1C & t::send ^t 
vk1C & y::send ^y 
vk1C & u::send ^u 
vk1C & i::send ^i 
vk1C & o::send ^o 
vk1C & p::send ^p 
vk1C & a::send ^a 
vk1C & s::send ^s 
vk1C & d::send ^d 
vk1C & f::send ^f 
vk1C & g::send ^g 
vk1C & h::send ^h 
vk1C & j::send ^j 
vk1C & k::send ^k 
vk1C & l::send ^l 
vk1C & z::send ^z 
vk1C & x::send ^x 
vk1C & c::send ^c 
vk1C & v::send ^v 
vk1C & b::send ^b 
vk1C & n::send ^n 
vk1C & m::send ^m 
vk1C & ,::send ^, 
vk1C & .::send ^. 
vk1C & /::send ^/
```

先に述べたCapsLockをEmacsキーバインドに応用する挙動のほか、

- Macでいう Control + Right/Left で画面移動する処理が、Windowsでも同様に実現できるようにしました。
- Macでいう Command + W のような処理が Henkan/Muhenkan でも同様に実現できるようにしました。

以下のリンクが参考になりました。

- [キーリスト - AutoHotKeyJP](https://sites.google.com/site/autohotkeyjp/reference/KeyList)
- [ホットキー - AutoHotKeyJP](https://sites.google.com/site/autohotkeyjp/reference/Hotkeys)
- [AutoHotKeyの1.1.27.07にしたらInvalid hotkeyエラー - Qiita](https://qiita.com/totto357/items/5d86ee80a654dd9ec95f)

## Future Work
### Google Chrome (等) のタブの遷移
Macの Google Chrome (等) では、 Command + Alt + Right/Left でタブ遷移が行えます。これを再現するために、たとえばWindowsでは Muhenkan + Alt + Right/Left でタブ遷移をするように設定したかったのですが、単純な方法では実現できませんでした。以下のページが参考になりました。

- https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=Autohotkey
    - 修飾キー以外のキーを修飾キーとして使う
    > ただし、２つ以上のキーは制御できない。