EmacsをWezTermで使っていると、日本語入力のままC-xを押してしまい、ミニバッファに変な文字が入ることがあります1。
そこで「押した瞬間に英数へ戻る」仕組みを作ることにしました。
1. Karabiner-Elementsで外側から解決する
Emacs的にはいつものC-xでも、IMEが日本語のままだと事故が起きます。
ここからが本題です。
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-fやC-x bで詰まることはほぼなくなりました。
体感的にはかなり快適です。
一方で、IMEを切り替えたこと自体はEmacsに伝わらないため、他のキーまで自動化すると混乱します5。
まずはC-xだけに絞るのが無難だと思います。
外側で安全装置を付けるやり方は、Emacsらしくないと感じる人もいるかもしれません。
ただ、毎日のストレスが減るなら、この割り切りも悪くない。
今はそう考えています。
- WezTermは、Rust製のGPU高速化ターミナルエミュレータで、クロスプラットフォーム対応、高いカスタマイズ性、多機能なマルチプレクサ機能を備えています。 – WezTerm 公式サイト
- Karabiner-Elementsは、macOS用のオープンソースキーボードカスタマイズツールです。JSON形式で詳細な設定を記述でき、アプリケーション別の条件分岐やIME制御にも対応しています。 – Karabiner-Elements 公式サイト
- bundle_identifiersでアプリケーションを指定する際、WezTermの場合は”com.github.wez.wezterm”または実行ファイルパスで指定します。frontmost_application_if条件により、前面アプリのみに動作を限定できます。 – Karabiner-Elements Documentation – frontmost_application
- japanese_eisuuは、macOSのIMEを英数モードに切り替える専用のキーコードです。Karabiner-Elementsではこれを利用してプログラマブルにIME制御が可能です。 – Karabiner-Elements – Key code list
- Karabiner-ElementsはmacOSのキーボードイベントレイヤーで動作するため、IME状態の変更はアプリケーション側からは検知できません。Emacs内部でIME状態を追跡する場合は、別途emacs-mozcなどのパッケージが必要です。 – Emacs Wiki – Input Methods