外付けキーパッドをKarabinerでトリガーにして、Keyboard Maestroマクロを実行する—貧者のStreamDeck—

やっすいUSBテンキーから各種マクロを実行。StreamDeckたっけぇなと思っているなら工夫でなんとかするしかない。
ふたつのユーティリティを組み合わせます。

#インストールするもの
- [Karabiner-elements](https://karabiner-elements.pqrs.org)
無償で使えますが、[スポンサーになったりワンショットで寄付（$10）もできます](https://karabiner-elements.pqrs.org/docs/pricing/#supporting-this-project)
キーボード、マウスなどのデバイスを自由にカスタムできるユーティリティ。有志の作った設定を読み込んで使ったりできますが、今回はJSONを書く必要があります。

- [Keyboard Maestro](https://www.keyboardmaestro.com/main/) 
$36。思いつくことは大抵できちゃうMacユーザーはとりあえず入れとけユーティリティ。説明がし辛いｗ日本語ドキュメントが少なかったんですが、[DTP Transit](https://dtptransit.design)で分かりやすく取り上げられるようになっていて、記事も多く、もしかしたら今が始め時かもしれません。
GUIでマクロ設計ができるので、JSON触らなくてもいいこのユーティリティで処理部分を受け持ちます。メンテが楽に。

>実はKeyboard Maestroにも外付けUSBデバイスのキーをトリガーにする機能がありますが、
![SS 2022-01-08 22.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/6d2b539d-ffe7-467d-01ce-bc3dc209ccc0.png)
>**入力したキーを捨てる**ことができません。
>キーパッドのEnterを押して自動化マクロを走らせようとすると、マクロ実行とともにEnterが入力されてしまいます。これが避けられるならKarabinerを使う必要はありませんが、このユーティリティの仕組み上無理なのかもしれない？知らんけど。
>
>そこで、その辺高機能なKarabinerでキー入力をトリガーとして、Keyboard Maestroのマクロを実行するJSONを仕込んでやります。実行部分はKeyboard Maestroなので、一度JSONを書けばあとのメンテはKeyboard Maestroでできます。
>
>両方とも、起動・実行に際してシステム環境設定＞セキュリティとプライバシーで各種権限を与えてやる必要があります。それぞれのインストール手引きに従ってください。

:::note warn
インストール操作自体に不安がある方はここで閉じた方が賢明です。
当たり前ですが自己責任でお願いします…ってQiitaに書くことじゃないか。
:::

##Keyboard Maestroの設定
とりあえずマクログループを作り**①**、マクロ本体を作成**②**、**③**で示した「or by script」部分をプルダウンします。
![SS 2022-01-09 0.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/781fc1d2-d6da-02cb-fa34-70e13c2e2e78.png)
![SS 2022-01-09 0.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/21d42112-b511-6e4c-5cb8-313b05ca1020.png)
「Or by URL」を選び、``kmtrigger://``で始まるいくつかの行から``macro=``が続く行を選択してコピーして、どっかにペーストしてとっといてください。マクロ名でなく、UUID指定の方がいいかなぁと。

:::note
マクロ名を```TEST_Macro_No1```のように当たり障りのない英数にしておけばURLエンコードされないので、一番最初のマクロ名指定されている行を使ってやればKarabinerのJSON設定ファイルで見通しがよくなりますが、KMでマクロ名を変更するとJSON書き直しです。UUID指定ならマクロ名関係ありません。
:::


``kmtrigger://macro=………``の**URL_Schemes**を使えば……例えばSafariのURL欄にペーストしてEnterでマクロが起動します。
詳しくは[https://wiki.keyboardmaestro.com/manual/URL_Schemes](https://wiki.keyboardmaestro.com/manual/URL_Schemes)参照。
後でこのURLを、Karabinerの実行部分で``open``コマンドの引数に指定します。

マクロ本体の作成方法は他のサイトを参照してください。できることが多すぎて簡単には説明できない。

##Karabiner-elementsの設定
インストールできていれば、メニューバーのカラビナアイコンから**Preferences...**を呼び出せます。
※その下の**Launch EventViewer...**もあとで使用します。
![SS 2022-01-09 0.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/2ab2a002-2e9d-056e-e97f-ae51bba53a7f.png)
**Devices**タブを開き、接続したUSBキーパッドにチェックを入れて操作できるようにしておきます。
また、ここに**表示されているVendor IDとProduct IDはメモ**しておいてください。**このIDを設定ファイル内で指定することで、対象をこのデバイスのみに限定させます。**※でないとメインキーボードのテンキー押したら発動しちゃうから。
![SS 2022-01-09 0.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/648edcab-a02d-a169-c2ab-c1097aca8735.png)

次に**Misc**タブを開き、**Open config folder**を押して設定ファイルのあるディレクトリを開きます。
![SS 2022-01-09 0.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/33e2bb0b-e1a9-ea6e-542d-4dcad8e9abaa.png)

**assets/complex_modifications**フォルダ内に、``数字.json``ファイルを作成します。キャプでは複数ありますが、いっこでいいです。
![SS 2022-01-09 0.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/0aa0de25-bd81-86a6-9266-f0af7967154e.png)

:::note
数字ファイル名でないとうまく読み込まれないことがあるそうで。
:::

##Event_Viewerでキー名を確認する
では、中身を書く前に入力するキー名を取得・確認しておきます。
メニューバーのカラビナアイコンから**Launch Event Viewer...**を選択します。
![SS 2022-01-09 1.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/ff0e3208-45aa-4c67-260a-234f984aff9b.png)
外付けテンキーの使いたいキーを押し、なんという名前になっているか確認します。
Enterキーなら、``return_or_enter``がそれです。

##JSONを書く
先ほど作成した数字.jsonファイルを開いて、中身を書きます。以下内容を変えて使用してください。

```json
{"title":"バッファローテンキー","rules":[

{"description":"キー操作タイトル","manipulators":[{"conditions":[{"type":"device_if","identifiers":[{
"vendor_id":ベンダーIDを数字で,
"product_id":プロダクトIDを数字で
}]}],"from":{
"key_code":"入力するキー（後で説明）"
},"to":[{
"shell_command":"open kmtrigger://マクロ名など"
}],"type":"basic"}]},

{"description":"そのほか全部無効","manipulators":[{"conditions":[{"type":"device_if","identifiers":[{"vendor_id":ベンダーIDを数字で,"product_id":プロダクトIDを数字で}]}],"from":{"any":"key_code"},"type":"basic"}]}]}
```

書き換えるところは、

- title
- description
- vendor_id
- product_id
- key_code
- shell_command

に続く部分です。**""**や**,**は正確に。特にvendor_idの数字の後の**,**を消さないように注意してください。
vender_idとproduct_idは設定通して全て同じにします。
最終行のvender_idとproduct_idもちゃんと書き換えてください。

``"shell_command":"open ``に続いて、先にコピーしたKeyboard MaestroマクロのURL_Schemesをペーストします。これで、キー入力をちゃんと捨てて、憂いなくKeyboard Maestroマクロを実行できるようになります。

:::note
他のShellコマンドも入れられますが、brewで入れたコマンドの場合フルパスを書かないといけないこともあります。whichとかwhereisでパス取得してください。
:::

キーごとに、真ん中の部分をコピーして増やします。こんな感じ。

```json
{"title":"バッファローテンキー","rules":[

{"description":"キー操作タイトル1","manipulators":[{"conditions":[{"type":"device_if","identifiers":[{
"vendor_id":ベンダーIDを数字で,
"product_id":プロダクトIDを数字で
}]}],"from":{
"key_code":"入力するキー（後で説明）"
},"to":[{
"shell_command":"open kmtrigger://マクロ名など"
}],"type":"basic"}]},

{"description":"キー操作タイトル2","manipulators":[{"conditions":[{"type":"device_if","identifiers":[{
"vendor_id":ベンダーIDを数字で,
"product_id":プロダクトIDを数字で
}]}],"from":{
"key_code":"入力するキー（後で説明）"
},"to":[{
"shell_command":"open kmtrigger://マクロ名など"
}],"type":"basic"}]},

{"description":"そのほか全部無効","manipulators":[{"conditions":[{"type":"device_if","identifiers":[{"vendor_id":ベンダーIDを数字で,"product_id":プロダクトIDを数字で}]}],"from":{"any":"key_code"},"type":"basic"}]}]}
```

##Karabinerに読み込む
再度、KarabinerのPreferencesウインドウを開き、**Complex modifications**タブから**Add rule**ボタンを押します。
![SS 2022-01-09 1.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/b05b7a26-7a44-a13d-22d1-9ece87211805.png)

:::note warn
ここで、今書いた設定が出てこないようならJSONの記述にミスがあります。よーく確認してください。
:::

![SS 2022-01-09 1.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/4e2d4796-f2d4-b322-cc40-4c65cdf582fc.png)
**Enable All**を押して設定ファイル全部を読み込ませるか、一つずつ有効にします。
この設定は上から順に見ていますので、**設定したキー以外を無視する「そのほか全部無効」設定は、一番下になるようにUp/Downボタンで移動してください。**

![SS 2022-01-09 1.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/7ac0c8ca-c2cc-a230-0207-4afb1cf3033e.png)
これで、外付けテンキーをKeyboard Maestroマクロ発動キーにすることができました。一度動作確認したら、キーを増やしたい時以外はKarabinerもJSONも触らずKeyboard Maestroマクロをいじるだけです。

マクロ名を変えても、UUID（```kmtrigger://macro=6D2F782A-3C78-4311-B6BC-40418BE7F4AD```みたいな指定）なら同じマクロを参照しますから、かなりラクにメンテナンスできると思います。
Keyboard Maestroならかなりの自動化が可能なので、面白そうだと思ったら試してみるといいでしょう。

##注意点
今のところ、全く同じデバイスを使い分ける…ということは、vendor_idやproduct_idがダブる場合は非常に難しいようです。
NumLock対策はしていません。できるかどうかまで調べていない。
「00」キー対策はKarabinerの普通の機能としてできそうですが、今はキーが足りてるので無視しています。