はじめに (対象読者・この記事でわかること)

本記事は、macOS 上で xyzzy(主に Emacs 系エディタ)を利用している開発者・プログラマーを対象としています。特に、Ctrl キーが頻繁に衝突する環境(例:リモートデスクトップや特殊キーボード)で作業する方に最適です。この記事を読むことで、以下ができるようになります。

  • xyzzy の modifier キーとして設定されている Ctrl を、macOS が認識できる F13 キーへ安全にリマップする手順が分かる
  • Karabiner‑Elements や hidutil を用いた具体的コマンド例と設定ファイルの書き方が理解できる
  • 実装中に遭遇しやすいエラーとその対処法を把握し、トラブルなく作業環境を整えることができる

執筆の背景は、複数の開発マシンを跨いで作業した際に、Ctrl キーが別プロセスで捕捉されてしまい、xyzzy のキーバインドが機能しなくなる問題を頻繁に経験したことです。この課題を自身で解決した経験を共有し、同様の悩みを抱える読者の助けになればと考えています。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • macOS のターミナル操作に慣れていること
  • Homebrew でツールをインストールできること
  • 基本的なキーリマップ概念(例:Ctrl → Cmd、Fn キーの役割)を理解していること

xyzzy の modifier キーとは? — 背景と基本概念

xyzzy(あるいは類似の Emacs ライクなエディタ)は、キーバインドの中心に「modifier キー」を持ちます。標準設定では Ctrl がその役割を担い、Ctrl‑xCtrl‑c など多数のショートカットが提供されます。しかし、macOS では Command キーがシステム全体のショートカットに深く結びついており、Ctrl キーが他アプリで占有されやすいという問題があります。

この問題を回避するひとつの手段が、Ctrl キーを macOS が認識できる別のキー(例:F13)に割り当て直す ことです。F13 は多くのキーボードで「F キー」領域に存在し、macOS のデフォルト設定ではほとんど使用されないため、衝突リスクが低い点が魅力です。リマップ後は、xyzzy の内部設定はそのままで、外部からは F13 が Ctrl として扱われます。

リマップには大きく分けて二つの方法があります。

  1. Karabiner‑Elements を使ってハードウェアレベルでキー変換を行う
  2. hidutil(macOS 標準の HID デバイス設定ツール)でソフトウェアレベルにカスタムマッピングを適用する

どちらも利点と欠点があり、今回は両方の手順を紹介しつつ、実務で最も安定する Karabiner‑Elements の設定例に重点を置きます。

Ctrl キーを F13 に変更する具体的な手順

以下では、実際に macOS (Ventura 13.5 以降) 環境で Ctrl キーを F13 にリマップし、xyzzy が正しく認識するまでの流れをステップバイステップで解説します。

ステップ 1: 必要なツールのインストール

Bash
# Homebrew が未インストールの場合はまずインストール /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Karabiner‑Elements を Homebrew Cask でインストール brew install --cask karabiner-elements

インストールが完了したら、システム環境設定 → セキュリティとプライバシー → プライバシー タブで「アクセシビリティ」に Karabiner‑Elements を追加し、フルディスクアクセスを許可します。設定が反映されるまで macOS を一度再起動すると安心です。

ステップ 2: Karabiner‑Elements の設定ファイル作成

Karabiner‑Elements は JSON 形式のルールファイルでキー変換を管理します。以下のディレクトリにカスタムルールファイルを作成します。

Bash
mkdir -p ~/.config/karabiner/assets/complex_modifications cat > ~/.config/karabiner/assets/complex_modifications/ctrl_to_f13.json <<'EOF' { "title": "Ctrl → F13 (xyzzy 用)", "rules": [ { "description": "Ctrl キーを F13 にリマップし、xyzzy が認識できるようにする", "manipulators": [ { "type": "basic", "from": { "key_code": "left_control", "modifiers": { "optional": ["any"] } }, "to": [ { "key_code": "f13" } ] }, { "type": "basic", "from": { "key_code": "right_control", "modifiers": { "optional": ["any"] } }, "to": [ { "key_code": "f13" } ] } ] } ] } EOF

このファイルは「左 Ctrl」と「右 Ctrl」をそれぞれ F13 に変換するルールです。注意点として、modifiers.optionalany を指定しておくことで、Ctrl 単体だけでなく、Ctrl+Shift などの組み合わせでも F13 が送信されます。

ステップ 3: Karabiner‑Elements にカスタムルールを有効化

Karabiner‑Elements の UI を開き、Complex Modifications → Add rule をクリックします。先ほど作成した「Ctrl → F13 (xyzzy 用)」が一覧に表示されるので Enable を選択してください。設定が反映されると、ステータスバーの Karabiner‑Elements アイコンが緑で点灯します。

ステップ 4: xyzzy 側の設定確認

xyzzy が Ctrl キーを modifier として認識できるか確認するために、以下のコマンドで現在のキーマップを表示します。

Bash
xyzzy -eval "(describe-key (kbd \"C-x\"))"

Ctrl キーが F13 に変換された状態でも、C-x が正しく認識されていれば成功です。もし認識されない場合は、~/.xyzzyrc に以下の行を追記し、F13 を explicit に modifier として登録します。

Lisp
;; F13 を Ctrl として扱う (define-key xyzzy-global-map (kbd "<f13>") 'control-prefix) ; 必要に応じてカスタマイズ

設定ファイルを保存後、xyzzy を再起動してください。

ステップ 5: 動作テスト

実際に xyzzy で C-f(文字を前に移動)や C-s(検索)などのショートカットを試します。全て期待通りに動作すれば完了です。


ハマった点やエラー解決

現象 原因 解決策
Ctrl キーが全く反応しない Karabiner‑Elements が macOS のアクセシビリティ許可を得ていない システム環境設定 → セキュリティとプライバシー → プライバシー → アクセシビリティ で Karabiner‑Elements を追加し、再起動
C- 系ショートカットが F13 として認識されない xyzzy がデフォルトで F13 を modifier と見なさない ~/.xyzzyrcdefine-key で F13 を control-prefix にバインド
複数のキー変換が競合する 既存の Karabiner‑Elements ルールで同じキーが別にマッピングされている 競合ルールを無効化し、今回作成したカスタムルールのみ有効化
リマップ後に Shift + Ctrl が効かない modifiers.optional が正しく設定されていない optional: ["any"] を必ず指定し、Shift 併用でも F13 が送出されるようにする

まとめ

本記事では、macOS 上で xyzzy の modifier キーである CtrlF13 にリマップする手順を、Karabiner‑Elementsxyzzy の設定 の観点から体系的に解説しました。

  • Karabiner‑Elements を用いて左・右 Ctrl を F13 に変換する JSON ルールを作成し、有効化する手順
  • xyzzy 側で F13 を control-prefix として認識させる設定例と、動作確認の方法
  • 実装中に遭遇しやすいエラー(アクセシビリティ許可不足、キー競合、modifier 認識)とその具体的な対処法

これらを実践することで、Ctrl キーが他アプリと衝突する環境でも xyzzy の豊富なショートカットをフル活用できるようになります。今後は、Option キーや Command キーとの複合リマップ、さらには iTerm2 や VSCode との統合 といった応用テーマにも挑戦し、記事にまとめていく予定です。

参考資料