Emacsを使っていると、メタキー(Optionキー)を頻繁に押すことになります1。M-xでコマンドを実行したり、M-fで単語単位の移動をしたり、日常的に何度も押すキーです。
しかし、日本語配列のキーボードでは、Optionキーはスペースバーの両脇、少し離れた位置にあります。
ホームポジションから指を大きく動かす必要があり、長時間使っていると指が疲れてきます。
1. 解決策:英数キーをメタキーに
そこで目をつけたのが、スペースバーの隣にある「英数」キーです。
親指ですぐに届く位置にあり、ホームポジションを崩さずに押せます。
ただし、英数キーはIME切り替えにも使うキーです。
完全に置き換えてしまうと、日本語入力の切り替えができなくなります。
そこで、Karabiner-Elementsを使って「長押し時はメタキー、単押し時は英数切り替え」という設定にします。これなら両方の機能を保ったまま、Emacsでの操作性を向上できます。
ちなみに、私は親指シフトで日本語入力しているので、「かな」キーはそのまま残すことにしました。
1.1. Karabiner-Elementsの設定手順
まず、Karabiner-Elementsをインストールします。
公式サイトからダウンロードするか、Homebrewを使っている場合は以下のコマンドでインストールできます2。
brew install --cask karabiner-elements
1.2. ルールJSONを記述する
Karabiner-Elementsを起動したら、「Complex Modifications」タブを開きます。
次に「Add your own rule」を選びます。

表示されたエディタに、以下のJSONを貼り付けます。
{
"description": "英数キーをhold時はOption、tap時は英数として動作",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "japanese_eisuu"
},
"to": [
{
"key_code": "left_option",
"lazy": true
}
],
"to_if_alone": [
{
"key_code": "japanese_eisuu"
}
]
}
]
}Code language: JSON / JSON with Comments (json)
この設定の意味を簡単に説明します。
from:英数キー(japanese_eisuu)を押したときにto:長押しの場合は左Optionキー(left_option)として動作to_if_alone:単押しの場合は英数キーとして動作
lazy: trueという設定により、他のキーと組み合わせて押したときだけOptionキーとして認識されます3。
JSONを貼り付けたら、右上の「Save」ボタンをクリックします。
Complex Modificationsの一覧に戻り、追加したルールの「Enable」をクリックすると設定が有効になります。
2. 追記:Meta+Shift など複合キーで詰まった
しばらく使ってみて、1つ問題が見つかりました。
英数キー → Meta の設定は、
英数を先に押した場合は問題ありませんが、
- Shift → 英数
- Control → 英数
- Command → 英数
のように 修飾キーを先に押してから英数キーを押すと、
英数キーが Meta として扱われず、M-S-> や C-M-f などの入力ができませんでした。
原因は、Karabiner-Elements の to_if_alone 判定です。
修飾キー(Shift / Control / Command)は
「他のキー」としてカウントされない場合があり、
英数キーが単押し扱いに落ちてしまうのです。
そのために、
- Shift / Control / Command / Option の押下状態をそれぞれ変数で管理
- いずれかが押されている場合は、英数キーを常に Meta
- 何も押されていない場合のみ
tap = 英数 / hold = Meta
というルールに変更しました。
2.1. 修正版の設定
Shift などを先に押してから英数キーを押すと、
英数キーは「あとから押された修飾キー」になるため、lazy な Option として認識されず、Meta が成立しませんでした。
そこで、
「Shift(または Control / Command)がすでに押されている状態で
英数キーが押されたら、英数キーを Option として扱う」
という専用ルールを先に定義することにしました。
{
"description": "英数: tap=英数 / hold=Option。かつ Shift/Control/Command を先にholdしていても英数holdをOptionとして成立させる",
"manipulators": [
{
"type": "basic",
"description": "Shift hold + 英数 -> Shift+Option (英数が後から押されてもOption扱い)",
"from": {
"key_code": "japanese_eisuu",
"modifiers": {
"mandatory": ["shift"],
"optional": ["any"]
}
},
"to": [
{
"key_code": "left_option",
"modifiers": ["shift"]
}
]
},
{
"type": "basic",
"description": "Control hold + 英数 -> Control+Option (英数が後から押されてもOption扱い)",
"from": {
"key_code": "japanese_eisuu",
"modifiers": {
"mandatory": ["control"],
"optional": ["any"]
}
},
"to": [
{
"key_code": "left_option",
"modifiers": ["control"]
}
]
},
{
"type": "basic",
"description": "Command hold + 英数 -> Command+Option (英数が後から押されてもOption扱い)",
"from": {
"key_code": "japanese_eisuu",
"modifiers": {
"mandatory": ["command"],
"optional": ["any"]
}
},
"to": [
{
"key_code": "left_option",
"modifiers": ["command"]
}
]
},
{
"type": "basic",
"description": "修飾なし: 英数 hold=Option(lazy), tap=英数(従来)",
"from": {
"key_code": "japanese_eisuu",
"modifiers": {
"optional": ["any"]
}
},
"to": [
{
"key_code": "left_option",
"lazy": true
}
],
"to_if_alone": [
{
"key_code": "japanese_eisuu"
}
]
}
]
}
Code language: JSON / JSON with Comments (json)
この修正により、
M-S->C-M-fCmd-M-x
といった 修飾キー先押しの組み合わせも安定して入力できる ようになりました。
このルールでは、
・from で「英数キー」かつ「特定の修飾キーが必ず押されている」状態を指定
・to で「Optionキーを押す」+「元の修飾キーもそのまま維持する」
という変換を行っています。
その結果、
Shift → 英数 → >
という順番で押しても、内部的には
Shift + Option + >
として認識され、Emacs では M-S-> が正しく入力されます。
2.2. なぜルールを分けているのか
Karabiner-Elements は、より条件の厳しいルールを先に書きます。
- 「修飾キーがすでに押されている場合」の特別ルール
- 「修飾なしの場合」の汎用ルール
という順序で定義することで、
・通常の英数切り替え
・英数を Meta として使う
・Meta + Shift / Control / Command の複合操作
のすべてを破綻なく両立させています。
- Emacsでは伝統的にMetaキーとAltキーが同じ役割を果たし、macOSではOptionキーがこれに対応します – Emacs Wiki: Meta Key
- Karabiner-Elementsは、macOSでキーボードをカスタマイズするための強力なオープンソースツールです – Karabiner-Elements 公式サイト
- lazy修飾キーは、単独で押された場合は修飾キーとして機能せず、他のキーと組み合わせた時のみ修飾キーとして動作します – Karabiner-Elements complex_modifications マニュアル