アフィリエイト広告を利用しています

画面共有のIME切り替え【Karabiner-Elements】英数/かなキー1発でローカルとリモートを同時に揃える

画面共有のIME切り替えをKarabiner-Elementsでローカルとリモート同時に揃えるイメージ図

Macの画面共有(Screen Sharing.app)でリモートのMacを操作しているときの、IME切り替え問題。

以前、「画面共有中は英数/かなキーがぜんぶリモートに送られてしまって、ローカルのIMEを切り替えられない」問題を、Karabiner-Elementsの select_input_source で解決する方法をこちらの記事に書きました。

ローカルの切り替えは単押し、リモートの切り替えはControl併用、という2系統の操作に分ける設計です。

で、ふと気づいたんですよね。

ローカルとリモートを、別々に操作する必要って、あるの?

英数/かなキーを押したら、ローカルとリモートを両方まとめて同じ状態にすればいいよね?と気づきました。

本当のストレスは「バラバラになる」ことだった

画面共有中にIMEで困る場面を思い返すと、こうです。

リモートで日本語を打っていた。ローカルに戻って打つと、ローカルは英数のまま。

「あれ?」

ローカルは「あ」、リモートは「A」。どっちがどっちだか、わからなくなる。

つまり、「切り替えられない」ことよりも、ローカルとリモートのIME状態がバラバラになることが、本当のストレスなんですよね。

だったら、答えはシンプル。押したら両方、揃えてしまえばいい。

英数/かなキーが「トグルではない」から成立する

この方式が成立するのは、英数/かなキーがトグルではなく確定動作だから。

英数キーを押せば、必ず英語入力になる。

かなキーを押せば、必ず日本語入力になる。

両側の状態がどんなにズレていても、1回押せば必ず同じ状態に収束する。「今どっちだっけ?」と考える必要が、なくなります。

仕組みは、1つのキーに2つのアクションを載せるだけ

Karabiner-Elementsには、性質のちがう2種類のアクションがある。

key_code でキーイベントを送ると、キーは前面アプリ(=画面共有)に渡って、リモートに届く。

select_input_source を呼ぶと、フォーカスアプリを経由せずに、macOSへ直接「ローカルの入力ソースを切り替えろ」と命令できる。

前回はこの2つを別のキー操作に割り当てていました。今回は、to_if_alone に両方併記します。

{
    "description": "画面共有中: 左Cmd 単押し → ローカルとリモートを両方 英数 に同期",
    "manipulators": [
        {
            "type": "basic",
            "conditions": [
                {
                    "type": "frontmost_application_if",
                    "bundle_identifiers": [
                        "^com\\.apple\\.ScreenSharing
quot;,
                        "^com\\.apple\\.RemoteDesktop
quot;
                    ]
                }
            ],
            "from": {
                "key_code": "left_command",
                "modifiers": { "optional": ["any"] }
            },
            "to": [
                { "key_code": "left_command", "lazy": true }
            ],
            "to_if_alone": [
                { "key_code": "japanese_eisuu" },
                {
                    "select_input_source": [
                        { "input_source_id": "com.apple.keylayout.ABC" }
                    ]
                }
            ]
        }
    ]
}

ポイントは to_if_alone の中身。

{ "key_code": "japanese_eisuu" } で、画面共有アプリ経由でリモートが英数に。

{ "select_input_source": ... } で、macOS直接命令でローカルがABCに。

左Cmdを単押しした瞬間、両方が同時に英数になる。かな側(右Cmd)も同じ構造で、japanese_kana と日本語の入力ソースIDを指定するだけです。

tolazy: true も大事で、これのおかげで左Cmdは普段どおり修飾キーとして機能する。Cmd+WやCmd+Tabは壊れません。

この仕組みを Claude Fable5 で作りました。

ルールは全部で6つ

  1. 画面共有中: Control + 英数キー(=左Cmd) → リモートだけ英数
  2. 画面共有中: Control + 右Cmd → リモートだけかな
  3. 画面共有中: 左Cmd 単押し → 両方英数に同期
  4. 画面共有中: 右Cmd 単押し → 両方日本語に同期
  5. (JIS物理キー用) 画面共有中: 英数キー → 両方英数に同期
  6. (JIS物理キー用) 画面共有中: かなキー → 両方日本語に同期

5・6は、JISキーボードの物理的な英数/かなキーを直接押した場合のフォールバック。to に同じく key_codeselect_input_source を併記する。

すべて frontmost_application_if で、画面共有アプリ(com.apple.ScreenSharing / com.apple.RemoteDesktop)が前面のときだけ発動するので、普段のIME切り替えには影響しません。

普段は単押しだけ。リモートだけ変えたい場面は、ほぼ無い。それでも念のため、Control併用のルール(1・2)も残してあります。

karabiner.json を編集する前に、必ずバックアップを行ってください。自己責任になります。

ハマりどころは、ルールの並び順

Karabinerはルールを上から順に処理する。並び順の制約は2つ。

まず、Controlルール(1・2)は、同期ルール(3〜6)より上に置く。同期ルールは optional: ["any"] なのでControl併用でも拾ってしまう。Control必須のルールを先に勝たせることで、「Control併用=リモートのみ」「素押し=両方同期」に振り分けられる。

そして、新しい6ルールは、既存の「Cmd単押し→英数/かな」系ルールより上に置く。逆だと、既存ルールが先にCommandを消費して、新ルールが永久に発火しない。

もうひとつ、simple_modifications にも注意です。

うちの環境では、simple_modifications で物理英数キー→ left_command に変換している。Karabinerは simple_modifications を complex_modifications より先に処理するので、英数キーは complex に届く時点で、すでに left_command になっている。Controlルールの fromjapanese_eisuu で書くと、永久に発火しない。

自分の環境で、キーがどう変換されてから届くのか。ここは要確認です。

「二重に発火しない?」は、大丈夫

to_if_alone で生成した japanese_eisuu が、下にあるJIS用ルール(5・6)にまた拾われて二重発火しそうな気がします。

が、大丈夫。

Karabinerは、生成イベントを他のルールで再処理しない。各ルールが見るのは物理キーだけ。

実は、この性質は初版でハマった原因でもあって(物理キーがCmdのままだと、japanese_eisuu 受けのルールは永久に発火しない)、今回の設計では逆に味方になっています。

入力ソースIDの調べ方

select_input_source に渡すIDは環境によって違います。ターミナルで確認できます。

defaults read com.apple.HIToolbox AppleEnabledInputSources

うちはmacOS標準のことえりで、英数が com.apple.keylayout.ABC、日本語が com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese。Google 日本語入力なら com.google.inputmethod.Japanese.base になります。

動作確認

画面共有でリモートMacに接続して、ウィンドウにフォーカスした状態で試します。

左Cmd単押し。ローカルのメニューバーが「A」になって、同時に、リモート画面内のIME表示も英数になる。

右Cmd単押し。両方「あ」になる。

Cmd+W。ちゃんとウィンドウが閉じる(修飾キーは無事)。

画面共有を閉じた通常状態では、従来どおりローカルだけが切り替わる。

「ローカルのメニューバー」と「リモート画面の中のIME表示」が、同時に同じ状態になれば成功です。

なお、リモート側は日本語入力ソースを持つmacOSであることが前提。

英数/かなキーを受けてIMEを切り替えるのはリモート側のmacOSなので、リモートにKarabinerを入れる必要はありません。

まとめ

「切り替える」から「揃える」へ。

設定量はほぼ変わらないのに、体感はまるで違いました。

「今どっちの状態?」と考えることが、なくなった。これが一番大きい。

to_if_alonekey_code(リモート行き)と select_input_source(ローカル直接)を併記するだけです。

画面共有を常用している方は、試してみてください。

この記事を書いた人

大東 信仁

カンパチが好きです。

プロフィールはこちら

10月14日開催 参加者募集中
(画像をタップ→詳細へ)

ミッションナビゲート モニター
(画像をタップ→詳細へ)

広告