MacのMoonlight + Karabiner-ElementsでWindows開発環境をリモート操作する

大したことはしてませんが、キーボード周りは生産性や快適さと直結するので、作業メモを残しておこうと思いました。

# 背景
UnityとC#に取り組み始めた初心者です。MacとWindowsの2台持ちで、Mac側には本業用の業務ツール・動画編集環境や、副業兼趣味のDTM環境を、Windows側にUnityやBlender、VisualStudioといった開発ツールを入れてます。

一応MacにもUnityをインストールしてみたのですが、UI Scalingができなかったり、グラフィック周りはWindowsの方が優れているので、UnityはWindowsで使いたいです。しかし、ディスプレイやキーボード等を物理的に切り替えるのは面倒くさいので、MacからリモートでWindows側を操作したいと思いました。

Microsoft公式のRDPや、Splashtopなど色々試しましたが、もっとも画面が綺麗で、遅延が少ないのが、NVIDIAが提供しているゲームストリーミング用のクライアント[Moonlight](https://moonlight-stream.org/)でした。

# 課題
しかし、リモートデスクトップで問題になるのが、日本語キーボードと一部の特殊文字の相性の悪さです。

具体的には
- \ (Backslash）
- | (Vertical Bar)
- _ (Underscore)

などコードを書くのに欠かせない文字が、Mac側から入力できないのがネックになりました。
同様の問題はMicrosoft RDPやSplashtopでも起きるみたいですが、Windows側でキーコードを調べてみたところ、Moonlightの場合はそもそも日本語キーボードのキー自体を認識していない、あるいは無視していることが分かりました。

>まあ、本来ゲームをリモートで遊ぶためのツールなので、日本語キーボードに対応する必要性も可能性もないのだと思います。

# 解決策
> Moonlight「見たこともないキーコードだ」
> Karabiner「じゃあ、見たことがあるキーコードに改変すればいいんだよ」

調べてみたところ、Macでは、[Karabiner-Elements](https://karabiner-elements.pqrs.org/)というツールを使うことで、キーマッピングを変更できます。また特定のアプリに限定して、マッピングを変更することもできます。

一方Windows側では、[Microsoft PowerToys](https://learn.microsoft.com/ja-jp/windows/powertoys/)を使うことで、キーマッピングを変更できます。

そこで、以下の方針で問題を解決することにしました。
- Karabinerで、Mac側の認識しないキー(\ | _)を、Windows側で使っていないキーに振り替える
    - ただしMoonlightがアクティブな時だけ
- PowerToysで、Mac側で振り替えたキーを、入力したい文字にアサインする

Mac、Windows双方のキースキャンツールで調べてみたところ、F16-F19キー(Mac)がWindows側で認識できて、何もアサインされていなかったのでここに特殊文字をアサインすることにしました。

まずMac側で、jsonファイルを書いて、~/.config/karabiner/assets/complex_modifications/に入れます。場所が分からなくても、Karabiner-ElementsのMiscタブで、ボタン一発で開けるので、探す必要はありません。次にComplex Modificationタブ>Add Ruleで、jsonに書いた設定内容を有効化します。その後、Windows側のPowerToysで、F16以降に特殊文字をアサインします。

|元のキー(Apple JIS Key)|Karabina|PowerToys|
|---|---|---|
|￥| F16|＼| 
|_|F17|_|
|Shift+_|F17|_|
|Shift+¥|F18|｜|


# Karabiner-Elementsの設定ファイル(json)

```json
{
  "title": "RDPwithMoonlight",
  "rules": 
    [
        {
        "description": "Backslash for Moonlight",
        "manipulators": 
            [
                {
                    "type": "basic",
                    "from": {"key_code":"international3"},
                    "to": 
                    [
                        {
                            "key_code":"f16"
                        }
                    ],
                    "conditions": [
                        {
                            "type": "frontmost_application_if",
                            "bundle_identifiers": 
                            [
                                "com.moonlight-stream.Moonlight"
                            ]
                            
                        }
                    ]
                }
            ]
        },
        {
        "description": "Underscore for Moonlight",
        "manipulators": 
            [
                {
                    "type": "basic",
                    "from": {
                        "key_code":"international1",
                        "modifiers": {
                            "optional": ["shift"]
                        }
                    },
                    "to": 
                    [
                        {
                            "key_code":"f17"
                        }
                    ],
                    "conditions": [
                        {
                            "type": "frontmost_application_if",
                            "bundle_identifiers": 
                            [
                                "com.moonlight-stream.Moonlight"
                            ]
                            
                        }
                    ]
                }
            ]
        },
        {
        "description": "Vertical-bar for Moonlight",
        "manipulators": 
            [
                {
                    "type": "basic",
                    "from": {
                        "key_code":"international3",
                        "modifiers": {
                            "mandatory": ["shift"]
                        }
                    },
                    "to": 
                    [
                        {
                            "key_code":"f18"
                        }
                    ],
                    "conditions": [
                        {
                            "type": "frontmost_application_if",
                            "bundle_identifiers": 
                            [
                                "com.moonlight-stream.Moonlight"
                            ]
                            
                        }
                    ]
                }
            ]
        }
    ]
}
```


# やってみてどうだったか？
成功です。快適に~~プログラミング~~チュートリアルをこなせています。

>しかしそこまでしてMacにこだわるべきなのか。
>そして作曲の才が枯れ果てた私が、DTM環境の維持にこだわるべきなのか。
>もう全部Windowsでいいんじゃないかという気がしてきました。

# 参考にした記事

多謝です。

https://www.870labo.com/posts/change-key-bind-with-karabiner-elements/
https://karabiner-elements.pqrs.org/docs/json/