Macbook US 配列キーボードの Caps Lock と US 配列 HHKB の Control キーで同じ英数・かな IME 切り替えを実現したい

この記事は、ゆめみ [Advent Calendar 2021](https://qiita.com/advent-calendar/2021/yumemi) の1日目の記事です。本当は Firestore で何か書きたかったんですが、何もネタが思いつかなかったのでストックを消費することにしました。

Macbook と HHKB （どちらも US 配列） のキーボードで、同じ IME 切り替え体験を実現するための Karabiner-Elements 設定方法です。

# TL; DR

達成したい要件

- CapsLock としての機能は使わない
- Control キーの単押しで英数・かなの IME 切り替えをしたい
- Control キー + 他のキー入力の際は、 IME 切り替えをしない

## 設定手順

### Complex modification rules を書く

以下の JSON を `~/.config/karabiner/assets/complex_modifications/` 配下に適当なファイル名で作る

```json:~/.config/karabiner/assets/complex_modifications/left_control_toggle_ime.json
{
  "title": "Left Control キーを単体で押したときに、英数・かなをトグルで切り替える",
  "rules": [
    {
      "description": "Left Control キーを単体で押したときに、英数・かなをトグルで切り替える",
      "manipulators": [
        {
          "type": "basic",
          "conditions": [
            {
              "input_sources": [
                {
                  "language": "ja"
                }
              ],
              "type": "input_source_if"
            }
          ],
          "from": {
            "key_code": "left_control",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "parameters": {
            "basic.to_if_held_down_threshold_milliseconds": 100
          },
          "to": [
            {
              "key_code": "left_control",
              "lazy": true
            }
          ],
          "to_if_held_down": [
            {
              "key_code": "left_control"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "japanese_eisuu"
            }
          ]
        },
        {
          "type": "basic",
          "conditions": [
            {
              "input_sources": [
                {
                  "language": "en"
                }
              ],
              "type": "input_source_if"
            }
          ],
          "from": {
            "key_code": "left_control",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "parameters": {
            "basic.to_if_held_down_threshold_milliseconds": 100
          },
          "to": [
            {
              "key_code": "left_control",
              "lazy": true
            }
          ],
          "to_if_held_down": [
            {
              "key_code": "left_control"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "japanese_kana"
            }
          ]
        }
      ]
    }
  ]
}
```

### Complex modifications rule をプロファイルに追加

1. Karabiner-Elements Preferences を開く
2. `Complex modifications` タブを開く
3. 左下の `Add rule` をクリック
4. 先ほど書いた Rules が見れるので、 `Enable` を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62103/95701880-3e76-ca27-9682-d1ebaabc78fa.png)

### Simple modifications で CapsLock を Control に上書き

Macbook のビルトインキーボードの CapsLock を Control として認識させつつ、単押しで英数・かな IME 切り替えをするなら必須です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62103/cb3638e5-5eda-af85-ccd4-b3b2dc563101.png)

キーボード設定の修飾キーカスタマイズだけでは、 CapsLock → Control はできても、それを英数・かな IME 変換にはできませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62103/802dbe2f-b252-706e-afbd-e56a75c41d97.png)

# 動機

Macbook を使い始めてしばらく、ビルトインキーボード（US配列）だけでタイピングしていました。
英数・かな IME 切り替えは、 CapsLock 切り替えを使っていました。[^ctrl-space]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62103/41c5752b-1418-e058-b868-54274b876afc.png)
こういうやつ

## HHKB 導入

そのうち、据え置き時は HHKB（US配列）を使うようになりましたが、ここで問題発生。
HHKB は CapsLock のところに Control があるんですよね。

「Control を英数・かな IME 切り替えに使いたいな〜」
「でも Controlは他のキーと組み合わせたバインドでも使うしなあ」
「外出時に Macbook 単体で使うこともあるから、ビルトインキーボードと同じようなタイピングができる設定に揃えられるといいなあ」


## 救世主、公式 Complex modification rules

そんな悩みでモヤモヤしながら、公式 Complex modifications を見てみると、日本語向けで良さそうなのを見つけました。

https://ke-complex-modifications.pqrs.org

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62103/5b0c4b7d-df60-9e9d-ab3f-83d573a1c4cc.png)


「なるほど、修飾キーを単体で押して機能させることってほぼないから、これを IME 切り替えにあてるのはアリだ」
「CapsLock で切り替えてたときと同じ体験にできる」
「オプションキーやコマンドキー単体の英数・かなトグルはあるけど、なぜか Control だけはない」
「無いなら自分で作るか」

で、今に至る

## 参考

[コマンドキー（左右どちらでも）を単体で押したときに、英数・かなをトグルで切り替える。 (rev 2)](https://github.com/pqrs-org/KE-complex_modifications/blob/5bc1d7cb2ee1f917463ce0c03cdfc0b504ff41d4/src/json/japanese.json.rb#L187-L260) を参考にました。
こういう感じで、 `left_command` を `left_control` に置き換えていくだけの単純なお仕事です。

```diff
  "to": [
    {
-     "key_code": "left_command",
+     "key_code": "left_control",
      "lazy": true
    }
  ],
  "to_if_held_down": [
    {
-     "key_code": "left_command",
+     "key_code": "left_control",
    }
  ],
  "to_if_alone": [
    {
      "key_code": "japanese_eisuu"
    }
  ]
```

需要があれば、すぐインポートできるよう、個人のリポジトリで Publish したり、あるいは本家に Pull Request でも送ってみようと思います。

https://github.com/pqrs-org/KE-complex_modifications

# どうでもいい話

一年以上あたためてしまった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62103/f04e4750-a5e1-47bb-abde-a307c194fe2e.png)

[^ctrl-space]: Ctrl-Space は、 IDE の補完とかぶるので避けたかった