【決定版】MacBookのUSキーボードで、左⌘をIMEオフ/右⌘をIMEオンにする（macもwindowsも）

## はじめに

MacBookではUSキーボードをつかいたいのです。その際に、

- Windowsもつかう必要があり、これはParallels上で動かしたいのです
- macOSでもWindows 11でも、`左⌘`で英数入力、`右⌘`でかな入力に切り替えたいのです（共通化したいのです）

ところが、制約条件がいろいろあります……。

- Karabiner-Elements(KE)で、`英数/かな`に割り当てると、macOSはOKですが、Paralles(Windows)は`英数/かな`キーのことを知りません
- KEは、`変換/無変換`を出力できません
- Microsoft IME(MS IME)は、`IME-オン/IME-オフ`のキー設定が、`変換/無変換`限定です
- MS IMEのバージョンを戻せば、柔軟にキーカスタマイズできますが、旧版をつかいたくありません
- Google IMEは、キーカスタマイズは柔軟ですが、Edgeで日本語の入力ができません

なかなか前途が多難でありますが、まわりみちをしながら

- macOS/Windows 共通で、`左⌘`で英数入力、`右⌘`でかな入力に切り替える
- Windows 11に標準でついてくるMS IMEをつかう

を実現しました。

## 概要

```plantuml
!includeurl https://raw.githubusercontent.com/matthewjosephtaylor/plantuml-style/master/style.pu

skinparam shadowing false

agent "MacBook Pro\nUSキーボード" as uskbd

Frame "Karabiner-Elements" {
  agent "左⌘:\t英数\n右⌘:\tかな" as eisukana
  agent "左⌘:\tctrl+shift+F9\n右⌘:\tctrl+shift+F11" as ctrlshift
  eisukana -[hidden]-> ctrlshift
}

Frame "AutoHotKey" {
  agent "ctrl+shift+F9:\t無変換\nctrl+shift+F11:\t変換" as muhenkan
}

Frame "Microsoft IME" {
  agent "無変換:\tIMEオフ\n変換:\tIMEオン" as imeonoff
}

uskbd -> eisukana : ≒Parallels
uskbd -> ctrlshift : Parallels

ctrlshift -> muhenkan : Windows 11

muhenkan -> imeonoff : Windows 11

```

- macOS上では、`左⌘`を`英数`キーに、`右⌘`を`かな`キーに割り当て（Karabiner-Elements）
- Parallelsでは、`ctrl+shift+F9/F11`にいったん割り当て、さらに`無変換/変換`にマップ

## 詳細

### Karabiner-Elementsの設定

下記ファイルを`~/.config/karabiner/assets/complex_modifications`に、ファイル名`japanese(custom).json`などで保存します。

```json
{
  "title": "For Japanese （日本語環境向けの設定）+ Parallels Desktop(Win)",
  "rules": [
    { "description": "コマンドキーを単体で押したときに、英数・かなキーを送信する。（左コマンドキーは英数、右コマンドキーはかな）",
      "manipulators": [
        { "type": "basic",
          "from": { "key_code": "left_command",
                    "modifiers": { "optional": [ "any" ] } },
          "to": [ { "key_code": "left_command" } ],
          "to_if_alone": [ { "key_code": "japanese_eisuu" } ],
          "conditions": [ { "type": "frontmost_application_unless",
                            "bundle_identifiers": [ "^com\\.parallels\\.desktop$",
                                                    "^com\\.parallels\\.vm$",
                                                    "^com\\.parallels\\.desktop\\.console$",
                                                    "^com\\.parallels\\.winapp\\." ] } ] },
        { "type": "basic",
          "from": { "key_code": "right_command",
                    "modifiers": { "optional": [ "any" ] } },
          "to": [ { "key_code": "right_command" } ],
          "to_if_alone": [ { "key_code": "japanese_kana" } ],
          "conditions": [ { "type": "frontmost_application_unless",
                            "bundle_identifiers": [ "^com\\.parallels\\.desktop$",
                                                    "^com\\.parallels\\.vm$",
                                                    "^com\\.parallels\\.desktop\\.console$",
                                                    "^com\\.parallels\\.winapp\\." ] } ] },
        { "type": "basic",
          "from": { "key_code": "left_command",
                "modifiers": { "optional": [ "any" ] } },
          "to": [ { "key_code": "left_command" } ],
          "to_if_alone": [ { "key_code": "f9",
                             "modifiers": ["left_shift", "left_control"] } ],
          "conditions": [ { "type": "frontmost_application_if",
                            "bundle_identifiers": [ "^com\\.parallels\\.desktop$",
                                                    "^com\\.parallels\\.vm$",
                                                    "^com\\.parallels\\.desktop\\.console$",
                                                    "^com\\.parallels\\.winapp\\." ] } ] },
       { "type": "basic",
         "from": { "key_code": "right_command",
                   "modifiers": { "optional": [ "any" ] } },
         "to": [ { "key_code": "left_command" } ],
         "to_if_alone": [ { "key_code": "f11",
                            "modifiers": ["left_shift", "left_control"] } ],
        "conditions": [ { "type": "frontmost_application_if",
                         "bundle_identifiers": [ "^com\\.parallels\\.desktop$",
                                                 "^com\\.parallels\\.vm$",
                                                 "^com\\.parallels\\.desktop\\.console$",
                                                 "^com\\.parallels\\.winapp\\." ] } ] }
        ]
    }
]
}
```
KEの`Preference > Comples modifications > Add rule`で、上記設定を読み込みます（`Enable`ボタンを押します）。

こちらの記事を（長年）参考にさせていただいています。
[USキーボードの左右Commandキーで仮想化Windowsの英数/かな入力を切り替える - Qiita](https://qiita.com/yukiri/items/6560e572dbe5eae4042f)

### AutoHotKey

AutoHotKeyをインストールし、Documentsフォルダに、`AHK_Script.ahk`などの名前でスクリプトを保存します。

```AHK_Script.ahk
#Persistent
#SingleInstance, Force
#NoEnv
#UseHook
#InstallKeybdHook
#InstallMouseHook
#HotkeyInterval, 2000
#MaxHotkeysPerInterval, 200
Process, Priority,, Realtime
SendMode, Input
SetTitleMatchMode, 2

Return

+^F9:: send, {vk1D} ; 無変換キー
+^F11::send, {vk1C} ; 変換キー
```

このスクリプトのショートカットを、スタートアップフォルダに入れます。

AutoHotKeyのインストールは、公式ページからインストーラをダウンロードして行いました。
[AutoHotkey公式ページ](https://www.autohotkey.com/)

スクリプトの書き方は、下記記事などを参考にしました。
[AutoHotkeyの基本設定・文法 - スズキのあしあと](https://ashiatoblog.com/posts/pc/autohotkey/ahk3/)
[『AutoHotkey』の使い方【入門編・初心者向け】 | FuchiAz.com](https://fuchiaz.com/usage-autohotkey/)

### MS IME

無変換キー→IME-オフ、変換キー→IME-オンにします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/3e1e249f-e55a-c74b-37a5-38a122d3d9c1.png" width=60%>


## おわりに

あちこちに落とし穴があって、なかなか調べ甲斐がありました。2015年からこの問題に取り組み続け、数多くの紆余曲折を経てきましたが、現時点での決定版です。

そこまでしてUSキーボードを使いたいか？

ええ。ぜったいUSキーボードがいいです（断言）。


### 環境

- AutoHotKey 1.1.33.10
- Windows 11 Home 21H2
- Parallels 17.1.1 (51537)
- macOS Monterey 12.2.1
- MacBook Pro (14-inch, 2021)