英数 M 【Karabiner-Elements】
MacBookの英数キーを
Emacsのためにメタキーにした

Emacsを使っていると、メタキー(Optionキー)を頻繁に押すことになります1
M-xでコマンドを実行したり、M-fで単語単位の移動をしたり、日常的に何度も押すキーです。

しかし、日本語配列のキーボードでは、Optionキーはスペースバーの両脇、少し離れた位置にあります。
ホームポジションから指を大きく動かす必要があり、長時間使っていると指が疲れてきます。

関連記事

1. 解決策:英数キーをメタキーに

そこで目をつけたのが、スペースバーの隣にある「英数」キーです。
親指ですぐに届く位置にあり、ホームポジションを崩さずに押せます。

英数キーをメタキーに変更 英数 変換 長押し:Option / 単押し:英数切替

ただし、英数キーはIME切り替えにも使うキーです。
完全に置き換えてしまうと、日本語入力の切り替えができなくなります。

そこで、Karabiner-Elementsを使って「長押し時はメタキー、単押し時は英数切り替え」という設定にします。これなら両方の機能を保ったまま、Emacsでの操作性を向上できます。

ちなみに、私は親指シフトで日本語入力しているので、「かな」キーはそのまま残すことにしました。

1.1. Karabiner-Elementsの設定手順

まず、Karabiner-Elementsをインストールします。
公式サイトからダウンロードするか、Homebrewを使っている場合は以下のコマンドでインストールできます2

設定手順 1 Karabiner-Elements 2 Complex Modifications 3 JSON設定を追加 4 ルールを有効化 設定内容 from: japanese_eisuu to: left_option (lazy: true) to_if_alone: japanese_eisuu
brew install --cask karabiner-elements

1.2. ルールJSONを記述する

Karabiner-Elementsを起動したら、「Complex Modifications」タブを開きます。
次に「Add your own rule」を選びます。

1.2. ルールJSONを記述する

表示されたエディタに、以下の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-f
  • Cmd-M-x

といった 修飾キー先押しの組み合わせも安定して入力できる ようになりました。

このルールでは、

・from で「英数キー」かつ「特定の修飾キーが必ず押されている」状態を指定
・to で「Optionキーを押す」+「元の修飾キーもそのまま維持する」

という変換を行っています。

その結果、

Shift → 英数 → >
という順番で押しても、内部的には
Shift + Option + >
として認識され、Emacs では M-S-> が正しく入力されます。

2.2. なぜルールを分けているのか

Karabiner-Elements は、より条件の厳しいルールを先に書きます。

  1. 「修飾キーがすでに押されている場合」の特別ルール
  2. 「修飾なしの場合」の汎用ルール

という順序で定義することで、

・通常の英数切り替え
・英数を Meta として使う
・Meta + Shift / Control / Command の複合操作

のすべてを破綻なく両立させています。

  1. Emacsでは伝統的にMetaキーとAltキーが同じ役割を果たし、macOSではOptionキーがこれに対応します – Emacs Wiki: Meta Key
  2. Karabiner-Elementsは、macOSでキーボードをカスタマイズするための強力なオープンソースツールです – Karabiner-Elements 公式サイト
  3. lazy修飾キーは、単独で押された場合は修飾キーとして機能せず、他のキーと組み合わせた時のみ修飾キーとして動作します – Karabiner-Elements complex_modifications マニュアル