また忘れた。MacのJIS配列キーボードで、英数入力のときに¥キーを押したらバックスラッシュが出るようにする方法を。
プログラマにとってバックスラッシュは日常的に使う記号です。正規表現のエスケープ、パス区切り、文字列リテラル。どこを見ても\だらけ。なのに、MacのJISキーボードでは¥キーを押すと¥が出る。いや、アプリケーションによっては\に見えることもあるけれど、それはフォントの気まぐれに過ぎない。本質的には¥記号であり、バックスラッシュではない。
この問題、新しいマシンをセットアップするたびに調べ直している気がします。毎回「そうだった、Karabinerで設定するんだった」と思い出すのですが、具体的な設定内容は綺麗さっぱり忘れている。そして検索して、試して、失敗して、また検索する。この不毛なループから抜け出すために、今回こそ自分の言葉で書き残すことにしました。
- JIS配列という呪い
- 直感的な解決策は、なぜか動かない
- macOSのキーボードレイアウト解釈という落とし穴
- Option+¥という秘密の呪文
- 動作の仕組みを図で理解する
- なぜ忘れるのか、そして書き残す意味
- まとめ
JIS配列という呪い
MacのJIS配列キーボードを使っていて、プログラミングをする人なら、誰もが一度は思うはずです。「なぜ¥なのか」と。いや、確かに日本では円記号を使います。¥500とか。でもそれはお金の話であって、プログラミングとは何の関係もない。
コードを書いている最中、正規表現で\d+と書きたいのに、キーを押すと¥d+になる。いや、見た目は\d+かもしれない。でもそれは嘘です。内部的には¥記号であり、環境によっては正しく動作しないことすらある。
US配列に切り替えれば済む話なのかもしれません。でも仕事のキーボードはJISだから、統一しておきたいんだよ。だったら、JIS配列のまま、¥キーを\に変換できればいいじゃないか。Karabiner-Elementsならできるはずだ。そう思って設定を始めたのが、苦難の始まりでした。
なお、日本語入力時のガイドはこちらにある。
直感的な解決策は、なぜか動かない
Karabiner-Elementsの、設定ファイルを開きます。やるべきことは明確です。¥キー(international3)を押したら、バックスラッシュ(backslash)を送ればいい。簡単だ。
{ "description": "Yen (JIS) -> Backslash", "manipulators": [ { "type": "basic", "from": { "key_code": "international3" }, "to": [ { "key_code": "backslash" } ] } ] }
この設定を追加して、意気揚々とテキストエディタで¥キーを押します。すると、画面に現れたのは[(左ブラケット)でした。
何かの間違いだと思いました。Karabiner-ElementsのEventViewerを開いて確認すると、確かにbackslashというキーコードが送信されています。設定は正しい。でも、実際に入力されるのは[。何度試しても同じ。設定を見直しても問題ない。なのに、動かない。
この「設定は正しそうなのに動かない」という状況が、一番混乱します。間違っているなら直せばいい。でも、どこが間違っているのか分からない。EventViewerはbackslashと言っているのに、アプリケーションは[を受け取っている。この不一致の理由が、最初はまったく理解できませんでした。
macOSのキーボードレイアウト解釈という落とし穴
しばらく悩んだ末に気づいたのは、Karabiner-Elementsが送っているのは「文字」ではなく「キーイベント」だという事実です。key_code: backslashは「バックスラッシュという文字を送る」のではなく、「backslashという名前のキーが押されたというイベントを送る」のです。
EventViewerでbackslashと表示されていても、それは単に「backslashキーというイベントが来た」という意味に過ぎない。実際のアプリケーションに届くのは、macOSがJIS配列として解釈した結果の文字なのです。このレイヤーの違いが、混乱の原因でした。
Option+¥という秘密の呪文
では、どうすればいいのか。答えは意外なところにありました。macOSのJIS配列では、歴史的な経緯により、ある秘密の組み合わせが定義されています。
- ¥キー単体を押す →
¥(円記号) - Option+¥を押す →
\(バックスラッシュ)
この仕様は、入力ソースが日本語かABCかに関わらず維持されます。JIS配列として認識されている限り、Option+¥は必ずバックスラッシュを生成します。つまり、Karabiner-Elementsで「怪しいbackslashキーコード」を送るのではなく、「macOSが確実にバックスラッシュを生成できる打鍵パターン(Option+¥)」を送ればいいのです。なんじゃそれ。知らんがな。
具体的な設定は次のとおりです。
{ "description": "JIS Yen -> Option+Yen (outputs backslash on macOS JIS)", "manipulators": [ { "type": "basic", "from": { "key_code": "international3", "modifiers": { "optional": ["any"] } }, "to": [ { "key_code": "international3", "modifiers": ["left_option"] } ] } ] }
ポイントを整理しておきます。
from.key_codeにinternational3を指定することで、JISキーボードの¥キーを対象にします。多くのJIS配列では、¥キーはinternational3として認識されます。
modifiers.optionalに["any"]を指定しているのは、ShiftやControlなどの修飾キーが押されていても、このルールを適用するためです。これがないと、たとえばShift+¥を押したときにルールが適用されず、期待通りの動作をしません。
そしてtoでは、international3にleft_option修飾キーを追加します。つまり、¥キーの入力を「Option+¥」の打鍵に変換しているわけです。
この設定を追加して、テキストエディタで¥キーを押すと、今度こそ\が入力されました。やっと、本当のバックスラッシュが手に入りました。
動作の仕組みを図で理解する
この設定がなぜ機能するのか、図にすると理解しやすくなります。

Karabiner-Elementsが受け取ったinternational3(¥キー)を、international3 + left_option(Option+¥)に変換して送信します。macOSはJIS配列の標準仕様に従って、この「Option+¥」という組み合わせを\に変換します。Karabiner-Elementsは単なる変換器で、あとはmacOSの確実な仕様に任せているわけです。
なぜ忘れるのか、そして書き残す意味
この設定方法、実は過去に何度も調べています。でも、毎回忘れます。なぜか。
理由は単純で、直感に反するからです。「バックスラッシュを入力したい」と思ったとき、普通は「backslashを送ればいい」と考えます。でも実際には「Option+¥を送る」のが正解。この思考のジャンプが、記憶に定着しにくいのだと思います。
だからこそ、今回は自分の言葉で、失敗の過程も含めて書き残すことにしました。失敗から学んだ教訓こそ、記憶に残りやすい。Karabiner-Elementsは「文字」ではなく「キーイベント」を送る。macOSのキーボードレイアウト解釈が間に入る。Option+¥はJIS配列でバックスラッシュを生成する標準仕様。これらの知識があれば、次に同じ問題に直面しても、すぐに解決できるはずです。
まとめ
MacのJIS配列キーボードで¥キーをバックスラッシュに変換するには、Karabiner-Elementsでinternational3をOption+international3にリマップします。
直感的にはto: backslashという指定で解決しそうに思えますが、macOSのキーボードレイアウト解釈により、意図しない文字([など)が入力されてしまいます。macOSの「Option+¥でバックスラッシュを入力できる」という仕様を活用することで、確実な動作を実現できます。
この記事を書いた一番の理由は、未来の自分が困らないようにするためです。未来の自分、覚えていますか。覚えてないだろうな。