C-x A 【Karabiner】
WezTerm上のEmacsでC-xを押すと
英数になるようにした

EmacsをWezTermで使っていると、日本語入力のままC-xを押してしまい、ミニバッファに変な文字が入ることがあります1
そこで「押した瞬間に英数へ戻る」仕組みを作ることにしました。

A WezTerm上のEmacsでC-xを押すと英数になる C-x 英数 Karabiner 日本語入力のままC-xを押しても 自動で英数に切り替わる

関連記事

1. Karabiner-Elementsで外側から解決する

Emacs的にはいつものC-xでも、IMEが日本語のままだと事故が起きます。

Karabiner-Elementsで外側から解決 macOS側でキー入力を処理 1 WezTermが 前面にある 2 C-xを 検知 3 C-x送信+ 英数キー発火 JSON設定でアプリ別条件分岐が可能

ここからが本題です。
Emacsの中で何とかするのは諦め、macOS側でキー入力を処理します。
使ったのはKarabiner-Elementsです2
キーイベントを条件付きで書き換えられるツールで、IME制御もできます。

{
    "description": "WezTermでC-xを押したら英数に切り替える",
    "manipulators": [
        {
            "conditions": [
                {
                    "bundle_identifiers": [
                        "^com\\.github\\.wez\\.wezterm$",
                        "/Applications/WezTerm.app/Contents/MacOS/wezterm-gui"
                    ],
                    "type": "frontmost_application_if"
                }
            ],
            "from": {
                "key_code": "x",
                "modifiers": {
                    "mandatory": ["control"],
                    "optional": ["any"]
                }
            },
            "to": [
                {
                    "key_code": "x",
                    "modifiers": ["control"]
                },
                { "key_code": "japanese_eisuu" }
            ],
            "type": "basic"
        }
    ]
}Code language: JSON / JSON with Comments (json)

WezTermが前面にあるときだけ、C-xを検知します3
その後、通常のC-xを送信し、続けて英数キー相当のイベントを発火させています4

2. 実際に使ってみた感想と限界

導入してから、C-x C-fC-x bで詰まることはほぼなくなりました。
体感的にはかなり快適です。
一方で、IMEを切り替えたこと自体はEmacsに伝わらないため、他のキーまで自動化すると混乱します5
まずはC-xだけに絞るのが無難だと思います。

外側で安全装置を付けるやり方は、Emacsらしくないと感じる人もいるかもしれません。
ただ、毎日のストレスが減るなら、この割り切りも悪くない。
今はそう考えています。

  1. WezTermは、Rust製のGPU高速化ターミナルエミュレータで、クロスプラットフォーム対応、高いカスタマイズ性、多機能なマルチプレクサ機能を備えています。 – WezTerm 公式サイト
  2. Karabiner-Elementsは、macOS用のオープンソースキーボードカスタマイズツールです。JSON形式で詳細な設定を記述でき、アプリケーション別の条件分岐やIME制御にも対応しています。 – Karabiner-Elements 公式サイト
  3. bundle_identifiersでアプリケーションを指定する際、WezTermの場合は”com.github.wez.wezterm”または実行ファイルパスで指定します。frontmost_application_if条件により、前面アプリのみに動作を限定できます。 – Karabiner-Elements Documentation – frontmost_application
  4. japanese_eisuuは、macOSのIMEを英数モードに切り替える専用のキーコードです。Karabiner-Elementsではこれを利用してプログラマブルにIME制御が可能です。 – Karabiner-Elements – Key code list
  5. Karabiner-ElementsはmacOSのキーボードイベントレイヤーで動作するため、IME状態の変更はアプリケーション側からは検知できません。Emacs内部でIME状態を追跡する場合は、別途emacs-mozcなどのパッケージが必要です。 – Emacs Wiki – Input Methods