USキーボードのOS XとParallelsで動いているWindowsのIMEをCapsLockでトグルする

USキーボードを日本語環境でお使いの皆様はどのようにしてIMEをオンオフしていますか？
Ctrl+何かは何かしらのアプリケーションとバッティングしそうで選びにくいんじゃないかと思います．特にCtrl+スペースはIDEを使って開発する人なんかは困りそうです．
[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)を使って日本語配列のように左右Commandをかなキーと英数キーとして扱う方法もありますが，Commandキーが仮想マシンでWindowsキーに相当するために，仮想マシンの方で間違えて押すとスタートメニューが出てとても悲しい気持ちになります．

そんな理由で私はCapsLockキーと右Optionキーに犠牲になってもらうことに決めました．

**Windowsのレジストリを変更します．何か間違えて，あるいは記事が間違ってて困ったことになっても私は責任を取りません．**不安であればスナップショットを取ってから作業してください．


#前提

- OS Xの上でParallelsでWindowsを動かしていて，両者ともUS配列に設定されている
- 右Commandや右Optionのどちらかが使えなくても困らない
- CapsLockが使えなくても困らない
- WindowsでF13あたりのキーを使っていない

#設定
まず右Commandか右OptionにMacのIMEトグルを割り当てます．次にCapsLockを割り当てたキーに変更して，CapｓLockでトグルできるようにします．そして割り当てたキーをWindowsではF13キーにして，そこにWindowsのIMEトグルを割り当てます．

ちょっとわけがわからないことになっていますが，私にはこうする方法しか思いつきませんでした．もっと簡単なソリューションがあれば教えてください．

## [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)
キーボード周りの動作をかなり細かくカスタマイズできるツールです．

1. インストールして使えるようにします
1. Ignore apps & devices -> Disable settings while you are using virtual machine. をオンにします．お好みでDisable settings while you are using Remote Desktop or VNC もオンにします．
1. For Japanese -> Change *** key -> Use *** as KANA/EISUU (toggle) をオンにします．使えるところは右Commandか右Optionだろうと思います．
1. 指定したキーでMacのIMEがトグルできること，仮想マシンのWindowsにフォーカスがあるときにはMacのIMEがトグルされないことを確認します．

## [Seil](https://pqrs.org/osx/karabiner/seil.html.ja) (CapsLockでトグルしたい場合)
CapsLock等を押下した時のキーコードを変更するツールです．

1. インストールして使えるようにします
1. Change the caps lock key をオンにし，ウインドウの下の部分にあるキーコードのリストを参考にしてkeycodeを先ほど設定したキーのものに設定します．右Commandは62，右Optionは61です．
1. Seilのウインドウに表示されているオレンジ色の注意書きのとおり，CapsLockを無効にします．
1. CapsLockキーでIMEがトグルできることを確認します．

## ゲストWindowsでの作業
[Windows キーボードレイアウトの変更](http://exlight.net/devel/windows/keyboard.html) を参考にしました．

1. 右Commandキーまたは右OptionキーをF13キーなどに割り当てます．
    下のコードの\*\*,\*\*と##,##を正しく埋め，その内容になるようにレジストリを変更します．ここで\*\*,\*\*はF13キーなどWindowsにおいてIMEトグルに割り当てるつもりのキーのスキャンコード，##,##は右コマンドキーまたは右Optionキーのスキャンコードです．レジストリの内容に書くときには数値がリトルエンディアンで表されることに注意が必要です．
    なお，すでにキー割り当ての変更がある人は上のサイトを参考にうまく追記してください．

    ```
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,**,**,##,##,00,00,00,00
    ```

    関係ありそうなスキャンコードをいくつか書いておきます．その他のキーは調べてください．なお，私は右OptionをF13にする設定のみ試しました．ここにあげたキーの組み合わせでうまく動かないものもあるかもしれません．

    | キー | スキャンコード | \*\*,\*\* or ##,## |
    |:--|:--|:--|
    | 右Command (右Win) | 0xe05c | 5c,e0 |
    | 右Option (右Alt) | 0xe038 | 38,e0 |
    | F13-23 | 0x64-0x6e | 64-6e,00 |

1. 再起動します．
1. IMEのキーバインドで半角/全角キー相当になるようにF13キーなどを設定します．
1. 右Commandまたは右Optionと，そのキーになるように設定したCapsLockでWindowsのIMEがトグルできることを確認します．このとき，先に確認した通り，MacのIMEはトグルされないはずです．

# 疑問点とか
### Karabinerの設定でかなキーと英数キーが押されるようにできるんだから，そのままゲストWindowsでかなキーと英数キーにそれぞれオンオフ割り当てればいいのでは？
うまくいきませんでした．推測ですが，WindowsはUS配列に設定されているため，かなキーと英数キーのスキャンコードが飛んできてもかなキーと英数キーの仮想キーコードにならないので，IMEに拾ってもらえないようです．

### 右Optionや右Commandを経由するのはなぜか
Karabinerで簡単にIMEトグルを設定できるのがそのあたりだからです．設定ファイルを書くなどするともう少し違った道のりになるのかもしれません．

### F13などを経由するのはなぜか
WindowsのIMEで設定できる単キーで，US配列に存在していて使っていないところがそのあたりだからです．

### CapsLockと右Option，同じ機能で嫌なんだけど
経由するのに使った右Commandや右OptionはSeilで違うキーにしても大丈夫だと思います．私はなんとなくコンテキストメニューキーにしましたが，押しどころがなく微妙です．