macOS Big Sur（ベータ版）でキー入力をリマップする

# はじめに

[macOS Big Sur](https://www.apple.com/jp/newsroom/2020/06/apple-introduces-macos-big-sur-with-a-beautiful-new-design/)のデベロッパ向けベータ版が公開されましたね。
早速インストールしてみたところ、~~愛用している[Karabiner-Elements](https://karabiner-elements.pqrs.org)が動作しなかったため~~[^1]、macOS標準の機能を利用してキー入力をリマップする方法について調査し、本記事としてまとめました。

[^1]: [Karabiner-Elements](https://karabiner-elements.pqrs.org)でBig Surがサポートされました。詳細は[Karabiner-Elements 13.0.0のリリースノート](https://karabiner-elements.pqrs.org/docs/releasenotes/#karabiner-elements-1300)を参照してください。

> macOS Big Surのデベロッパ向けベータ版は、本日より、developer.apple.com/jpを通じてApple Developer Programのメンバーに提供されます。Macユーザーに対しては来月中にパブリックベータプログラムがbeta.apple.comで提供されます。macOS Big Surは今秋、無料のソフトウェア·アップデートとして提供されます。互換性のあるMacのモデルを含む詳しい情報は、apple.com/macos/big-sur-previewをご覧ください。提供される機能は変更される場合があります。一部の機能は、国や地域、言語によっては利用できない場合があります。
https://www.apple.com/jp/newsroom/2020/06/apple-introduces-macos-big-sur-with-a-beautiful-new-design/

本記事では、次のmacOS標準の機能2つを組み合わせてリマップを実現しています。[^2]

[^2]: 今回の「Left Command」のように、リマップ元とリマップ先に同じキーがあるとhidutilだけでは実現できなかったため、修飾キーのリマップを組み合わせています。リマップ元とリマップ先に同じキーがないリマップの場合はhidutilだけで事足りると思います。

1. 修飾キーのアクション変更
2. hidutil[^3]を利用したリマップ

[^3]: hidutilはmacOS Sierraから導入されているキーリマップツールです。

|リマップ元の物理キー|1. 修飾キーのアクション変更|2. hidutilを利用したリマップ|リマップ先の論理キー|
|:-:|:-:|:-:|:-:|
|Caps Lock[^4]|Caps Lock<br/>↓<br/>Left Command|ー|Left Command|
|Left Command|Left Command<br/>↓<br/>Left Control|Left Control<br/>↓<br/>英数|英数|
|Right Command| Right Command<br/>↓<br/> Right Control| Right Control<br/>↓<br/>かな カナ|かな カナ|

[^4]: Apple内蔵キーボードはCaps Lock。外付けのHHKB Professionalも利用しているので、そちらはLeft Controlをリマップしています。

この方法は、macOS Sierraで導入されたhidutilを利用しているため、macOS Sierra以降で動作します。
なお、macOS CatalinaおよびBig Sur（ベータ版）については動作検証も実施済です。

# 修飾キーのアクション変更
1. 「システム環境設定」アプリで、「キーボード」を選択。
2. 「修飾キー...」を選択。
3. 次のように「修飾キー」のアクションを変更します。（Caps Lockについてはお好みで。）[^5]
<img width="780" alt="スクリーンショット 2020-06-25 12.14.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/4849c551-cdb9-498a-9219-a7fc55ccbefa.png">

[^5]: macOS Big Surはまだベータ版のため、スクリーンショットはmacOS Catalinaで採取したものになります。

# hidutilを利用したリマップ

hidutilにリマップ元およびリマップ先のキーコード（hex）[^6]を指定して実行します。

[^6]: [USBキーボードのキーコード](http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html) は[Technical Note TN2450 Remapping Keys in macOS 10.12 Sierra](https://developer.apple.com/library/archive/technotes/tn2450/_index.html)にも載っていなかった「英数」、「かな カナ」キーの記載もあり、とてもわかりやすかったです。

```bash
$hidutil property --set '{"UserKeyMapping":[
  {
    "HIDKeyboardModifierMappingSrc": 0x7000000E0,
    "HIDKeyboardModifierMappingDst": 0x700000091
  },
  {
    "HIDKeyboardModifierMappingSrc": 0x7000000E4,
    "HIDKeyboardModifierMappingDst": 0x700000090
  },
]}'
```

今回利用したキーコード（hex）は以下となります。

|キー|キーコード（hex）|
|:-:|:-:|
|Left Control|0x7000000E0|
|Right Control|0x700000091|
|英数|0x7000000E4|
|かな カナ|0x700000090|


なお、hidutilで設定した値はmacOSの再起動時にクリアされてしまいます。
対処方法としては、`~/Library/LaunchAgents` に以下の `com.example.KeyRemapping.plist`[^7] を配置することで、macOS起動時に毎回hidutilが実行されるようになります。

[^7]: https://gist.github.com/chuyeow/2ab2d3e6a649389cea58f4d31f7f6d53#file-com-example-keyremapping-plist を参考にしています。また、好みの問題ですが私はexampleの部分をuserIdに変更して利用しています。

```com.example.KeyRemapping.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.KeyRemapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/hidutil</string>
        <string>property</string>
        <string>--set</string>
        <string>{"UserKeyMapping":[
          {
            "HIDKeyboardModifierMappingSrc": 0x7000000E0,
            "HIDKeyboardModifierMappingDst": 0x700000091
          },
          {
            "HIDKeyboardModifierMappingSrc": 0x7000000E4,
            "HIDKeyboardModifierMappingDst": 0x700000090
         }
        ]}</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
```

# macOS Big Sur beta 5 で日本語入力への切替ができなくなった場合の対応方法（追記）

macOS Big Sur beta 5 にアップデートしたところ、日本語入力への切替ができなくなるという現象が発生しました。
同様の現象が発生した方がいましたら、現象発生時の対応方法をまとめたので参考にしてください。

* [macOS Big Sur beta 5 で日本語入力への切替ができなくなった場合の対応方法](https://qiita.com/zizi4n5/items/edc12a3e2e201c6ebeb1)

# 参考文献
* [macOS Big Sur](https://www.apple.com/jp/newsroom/2020/06/apple-introduces-macos-big-sur-with-a-beautiful-new-design/)
* [Karabiner-Elements](https://karabiner-elements.pqrs.org)
* [Karabiner completely broken on macOS Big Sur #2331](https://github.com/pqrs-org/Karabiner-Elements/issues/2331)
* [Remapping keys on macOS](https://blog.codefront.net/2020/06/24/remapping-keys-on-macos)
* [USBキーボードのキーコード](http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html)
* [Technical Note TN2450 Remapping Keys in macOS 10.12 Sierra](https://developer.apple.com/library/archive/technotes/tn2450/_index.html)
* [macOS Big Sur beta 5 で日本語入力への切替ができなくなった場合の対応方法](https://qiita.com/zizi4n5/items/edc12a3e2e201c6ebeb1)