JIS配列のMacでUS配列キーボードを使う時のキーボードの種類の切替方法

**(2021/4/19 追記)**
この事象が起こるのは`Karabiner-Elements`を使っている場合のみで、原因は**Virtual keyboard機能**にありそうです。
Macにはキーボードごとに配列を記憶してくれる機能があるみたいですが、先述の機能によりうまく動いてくれません。
おそらくですが、OSには入力しているキーボードが**Karabiner DriverKit VirtualHIDKeyborad x.x.x**かのように見えているためかと考えています。
そのため、**Virtual keyboard**を無効化できれば解決しそうですが、無効化の方法が見つかりませんでした。（実際に`Karabiner-Elements`を終了してみるとキーボードごとに判定される）
いつかまた状況が変わるかもしれませんが、とりあえず以下の運用を続けています。

---
JIS配列のMacbookでUS配列のキーボード（HHKB等）を使っていると起こる、キーボードの種類切替めんどくさい問題。
~~色々検索してみたところ、`Karabiner-Elements`でプロファイル切り替えが安定していそうです。~~
そもそも原因は`Karabiner-Elements`でした。

参考にさせていただいた記事：[AlfredでKarabiner-Elementsのプロファイルを切り替えるWorkflowの作り方](https://webrandum.net/alfred-karabiner-elements-change-profile/)

私は`Alfred`を使っていないので、`Automator` + `AppleScript`でやってみました。


### 環境
MacBook Air (M1, 2020) - JIS配列
macOS Big Sur (11.2.3)
Karabiner-Elements (13.4.0)
Bluetoothキーボード - US配列

## Karabiner-Elementsのインストール
[Karabiner-Elements](https://karabiner-elements.pqrs.org)
設定方法等は割愛します。

## Karabiner-ElementsでProfileの作成
`Karabiner-Elements`の設定で`Profiles`を選び、**JIS**と**US**を作ります。このProfileの名称をスクリプトで使うので、違う言葉を使いたい人は後述のスクリプトでも適宜変更してください。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/699144d2-b0a4-b107-a467-1a24a2cd990e.png)
この時点では中身は考えなくて良いですが、すでに設定してあるものがある場合は新しいProfileにも全て設定しないといけません。
コピーする方法があるのかもしれませんが、知りません。。。教えてください。

Profileが作れたら`Virtual keyboard`の設定を変更します。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/53271dd1-2a5d-c037-f22a-b4ddb3496622.png)
`Country code`を以下のとおり設定します。
**US：0**
**JIS：45**

値を変えるとMacのキーボード設定アシスタントが出てくるはずです。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/4421181f-dfa7-5bb4-86d9-bca79e200234.png)
こちらを進めて、**US**の時は`ANSI(US配列)`、**JIS**の時は`JIS`で設定しておきます。
キーボード設定アシスタントが出てこない時は`Country code`の上下矢印で一度別の値に変えると表示されたりするので、画面が表示されてから`Country code`を正しい値に設定し、キーボード設定アシスタントをやってみてください。
それでも出ない場合はそれぞれの状態で環境設定のキーボードからやった方がいいかもしれません。

## 切り替えるスクリプトの作成
いよいよスクリプト作ります。
今回はキーボードショートカットに入れたいので、`Automator`の`クイックアクション`を選びます。
ワークフローの受け取る項目を`入力なし`に変え、`ユーティリティ`の`シェルスクリプトを実行`で以下のスクリプトを入力します。

```zsh
# 現在のprofileを取得
cur=`'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --show-current-profile-name`

# US/JIS
if [ $cur = "JIS" ]; then
	par="US"
else
	par="JIS"
fi

# profileの切替
'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --select-profile $par
```
結果、こんな感じになります。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/78854d3f-6215-f53c-844b-48f85aebb934.png)
スクリプトができたら右上の実行を押してみて、うまく切り替わってるか確認。
現在のProfileはメニューバーで確認できます。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/10c1506c-fce2-8cf0-efde-a1cb58c2f2c9.png)
実行でエラーなく、実行後に切り替わってればOK。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/bb6655cf-643d-6bb8-8d08-3fcb3579f356.png)
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/f1fe48e5-dccd-888a-1563-8146d8fec66a.png)
うまくできたら保存して適当に名前をつけておいてください。
スクリプト作成は終了です。

## ショートカットへの登録
先ほど、`クイックアクション`を作成して保存したので、環境設定 -> キーボード -> ショートカットのサービスに`Automator`で作成した`クイックアクション`が登録されています。
そちらにショートカットキーを登録すれば完成です！
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108198/bdc56160-3942-eccc-f364-7f6ada58c8e1.png)
（私はスクリプト名を`キーボードタイプ切り替え`にして、``Ctrl+/ ``を登録しています。）


## さいごに
お疲れ様でした。
せっかくキーボードショートカットに登録しているものの、使う機会も少なく、ショートカットを忘れがちです。
もし使っていないキーがあれば、`ショートカットを複雑にしてそのキーをKarabiner-Elementsに設定することで1ボタンで切り替え`とかもできそうですが、そうなるとMacbook単体ではショートカット操作ができないとかが出てきそうです。
色々あるとはわかっていつつ、やっぱり面倒なので、Plag & Playでできる世界が来てほしいです。