Macの画面共有(Screen Sharing.app)で別のMacを操作しているとき、手元のMacで日本語を打ちたいのに、英数/かなキーがぜんぶリモートに吸われてローカルのIMEが切り替えられない、、、ということ、ありませんか?
Karabiner-Elements で「英数/かなキーは普段どおりローカルのIME切替に使い、Control を足したときだけリモートへ送る」と、この設定に、Claude Codeできれいに解決しました。
この記事では、その設定をコード付きで紹介します。
どういう問題なのか
画面共有のウィンドウがフォーカスを持っている間、キー入力は基本ぜんぶリモートに転送されます。
Cmd + Tab みたいなシステムショートカットは「ローカルに残す」設定の対象になるんですが、英数/かなキーは「ただのキー入力」として扱われるので、その対象から外れてしまうんですよね。
結果として、
- 手元のMacで日本語を打ちたいのに、IMEが切り替えられない
- かなキーを押しても、反応するのはリモート側のIMEだけ
という、地味にストレスのたまる状態になります。
なぜ普通の方法だとうまくいかないのか
最初に思いつくのが「シェルコマンドで英数キーを送る」方法なんですが、これは失敗します。
{
"from": { "key_code": "right_option" },
"to": [{
"shell_command": "/usr/bin/osascript -e 'tell application \"System Events\" to key code 102'"
}]
}
キー → シェル → AppleScript で英数キーを送る、という流れなので、結局フォーカスしているアプリ(=画面共有)に届いてしまう。同じ問題に戻るだけなんですよね。
じゃ、どうすれば、いいのか?
答えは select_input_source を直接呼ぶこと
Karabiner-Elements には select_input_source という、macOSに直接「入力ソースを切り替えろ」と命令するアクションがあります。
これを使うと、フォーカスしているアプリ(=画面共有)を経由せずにローカルのIMEを切り替えられる。philosophyとして一貫していて、いちばんきれいに動きます。
しかもこれを to_if_alone(=単押しのときだけ発火)と組み合わせると、
- Cmdキーを単押ししたとき → ローカルIMEを切り替え
- Cmdキーを押しっぱなしにして他のキーと組み合わせたとき → 普通の修飾キー(Cmd+W など)として機能
という二刀流ができます。Cmd+W が壊れないのがうれしいポイント。
まずは「ローカルに留める」基本の設定
英数/かなを画面共有に取られず、ローカルのIME切替に使う設定がこちらです。
~/.config/karabiner/assets/complex_modifications/screen-sharing-ime-fix.json に置きます。
{
"description": "画面共有中: 左Cmd 単押し → ローカル ABC に切替",
"manipulators": [
{
"type": "basic",
"conditions": [
{
"type": "frontmost_application_if",
"bundle_identifiers": [
"^com\\.apple\\.ScreenSharing$",
"^com\\.apple\\.RemoteDesktop$"
]
}
],
"from": {
"key_code": "left_command",
"modifiers": { "optional": ["any"] }
},
"to": [
{ "key_code": "left_command", "lazy": true }
],
"to_if_alone": [
{
"select_input_source": [
{ "input_source_id": "com.apple.keylayout.ABC" }
]
}
]
}
]
}
ポイントは frontmost_application_if で 画面共有のときだけ 発火するように絞っているところ。
^com\.apple\.ScreenSharing$→ 画面共有.app^com\.apple\.RemoteDesktop$→ Apple Remote Desktop
これで画面共有が前面にないときは、このルールは素通りして普段の動きのままになります。
同じ要領で、右Cmd → 日本語IME も書いておきます。
{
"description": "画面共有中: 右Cmd 単押し → ローカル日本語 IME に切替",
"manipulators": [
{
"type": "basic",
"conditions": [
{
"type": "frontmost_application_if",
"bundle_identifiers": [
"^com\\.apple\\.ScreenSharing$",
"^com\\.apple\\.RemoteDesktop$"
]
}
],
"from": {
"key_code": "right_command",
"modifiers": { "optional": ["any"] }
},
"to": [
{ "key_code": "right_command", "lazy": true }
],
"to_if_alone": [
{
"select_input_source": [
{
"language": "ja",
"input_source_id": "com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese"
}
]
}
]
}
]
}
ここまでで「英数/かなはローカルに留まる」状態になります。
ここからが本題。「リモートにも送りたいとき」をどうするか
これで、いつでもIMEの切り替えはローカルを操作できます。
でも、リモート側のMacでも日本語/英数を切り替えたい場面は当然あります。
そこで考えたのが、Control を足したときだけリモートへ送るという両取りの設計です。
- 英数/かなをそのまま押す → ローカルIMEを切り替え(さっきの設定)
- Control を足して押す → リモートへ英数/かなを送る
これなら、ひとつのキーで両方の世界を行き来できます。
リモートへ送るルールがこちら。
{
"description": "画面共有中: Control + 左Cmd → リモートに 英数 を送る",
"manipulators": [
{
"type": "basic",
"conditions": [
{
"type": "frontmost_application_if",
"bundle_identifiers": [
"^com\\.apple\\.ScreenSharing$",
"^com\\.apple\\.RemoteDesktop$"
]
}
],
"from": {
"key_code": "left_command",
"modifiers": {
"mandatory": ["control"],
"optional": ["caps_lock"]
}
},
"to": [
{ "key_code": "japanese_eisuu" }
]
}
]
}
modifiers.mandatory に control を入れて「Control必須」にし、to では Control を剥がした素の英数キー(japanese_eisuu)を生成しています。
これで生成された英数キーは、前面アプリ(=画面共有)経由でリモートに届くという仕組みです。かな側も right_command + Control で同じように書けます。
順番がめちゃくちゃ大事
ここ、地味だけど超重要なポイントです。
Karabiner はルールを上から順に処理します。 そして「ローカルに留める」ルールは modifiers: { "optional": ["any"] } になっているので、Control を足しても素通りで拾ってしまうんですよね。
なので、リモート送出ルール(Control必須)を、ローカル切替ルールより上に置く必要があります。
[上]
✅ Control + 左Cmd → リモートに 英数 ← Control必須・先に勝つ
✅ Control + 右Cmd → リモートに かな ← Control必須・先に勝つ
✅ 左Cmd 単押し → ローカル ABC
✅ 右Cmd 単押し → ローカル日本語 IME
[下]
こうしておくと、Control を足したときはリモート送出ルールが先に勝つ。Control なしの素押しは、リモート送出ルールにマッチせず下のローカル切替ルールに落ちる。きれいに振り分けられます。
ここでハマりました。simple_modifications の落とし穴
さて、設定して意気揚々とテストしたんですが、、、
Control + 右Cmd は効くのに、Control + 英数キー がぜんぜん反応しない。
あれ?なんで?となりました。
原因を追っていったら、わたしのKarabinerには simple_modifications(シンプルなキー置き換え)で、こんな設定が入っていたんです。
英数キー(japanese_eisuu) → left_command
つまり、物理の英数キーは left_command に置き換えられていた。普段わたしが「左Cmd=英数」として使えていたのは、まさにこの置き換えのおかげだったんですね。
で、ここがポイントなんですが、Karabiner は simple_modifications を complex_modifications より先に処理します。
キー入力 → simple_modifications → complex_modifications
なので、英数キーを押した瞬間に left_command へ変換され、complex 側に届くころには英数キーではなくなっている。japanese_eisuu を待っていた最初のルールが、永久に発火しなかったわけです。
理屈がわかれば簡単で、リモート送出ルールの from を japanese_eisuu ではなく left_command で受けるように直したら、あっさり動きました。
"from": {
"key_code": "left_command",
"modifiers": {
"mandatory": ["control"],
"optional": ["caps_lock"]
}
}
「自分の英数キーが、本当はどのキーコードで届いているのか」を確認するのが大事、という教訓でした。
完成した動き
最終的にこうなりました。
| 押すキー | 動き |
|---|---|
| 英数キー(素押し) | ローカルを英数に |
| かなキー / 右Cmd(素押し) | ローカルをかなに |
| Control + 英数キー | リモートを英数に |
| Control + 右Cmd | リモートをかなに |
ひとつのキーで、ローカルとリモートを行ったり来たり。画面共有しながらの作業がだいぶ快適になりました。
まとめ
- 画面共有中、英数/かなキーはリモートに吸われてローカルIMEが切り替えられなくなる
- Karabinerの
select_input_sourceをto_if_aloneで呼べば、ローカルIMEを直接切り替えられる frontmost_application_ifで「画面共有のときだけ」に絞るのがコツ- Control を足したときだけリモートへ送るようにすると、ローカルもリモートも両取りできる
- リモート送出ルールは、ローカル切替ルールより上に置く
simple_modificationsで英数キーが別のキーに置き換わっていないか要チェック(complexより先に処理される)
入力ソースのIDは環境によって違うので、参考に載せておきますね。
| 用途 | input_source_id |
|---|---|
| 英語(ABC) | com.apple.keylayout.ABC |
| ことえり日本語 | com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese |
| Google日本語入力 | com.google.inputmethod.Japanese.base |
正確なIDはターミナルでこのコマンドを叩くと確認できます。
defaults read com.apple.HIToolbox AppleEnabledInputSources
画面共有での日本語入力にモヤモヤしている方は、ぜひお試しください。







