特定のキーに強制的にコマンドを割り当てる方法

Emacsにて、グローバルなキーマップ(global-map)を変更しても、すべてのバッファで有効にはなりません。 なぜなら、メジャーモードやマイナーモードでのマップがglobal-mapより優先するからです。 しかし、メジャーモードの特定のキー割り当てが気に入らず、自分用のコマンドを適用したいことがあります。

たとえば、僕の場合、C-tにother-window-or-spritというコマンドを割り当てています。そろそろEmacsのウィンドウについて一言いっとくか - http://rubikitch.com/に移転しました 参照。 C-tはdired-modeではimage-dired用のプレフィクスになっていてother-window-or-spritが使えません。

この場合は、キーマップ上書き専用マイナーモードを用意するのが手軽です。 こうすることでoverriding-minor-modeがバッファローカルで常に有効になります。 これでdired-modeでもC-tでother-window-or-spritが実行されます。

;; (makunbound 'overriding-minor-mode-map)
(define-minor-mode overriding-minor-mode
  "強制的にC-tを割り当てる"             ;説明文字列
  t                                     ;デフォルトで有効にする
  ""                                    ;モードラインに表示しない
  `((,(kbd "C-t") . other-window-or-sprit)))

ここでのポイントは、第5引数のキーマップの指定です。 ここでは、キーとコマンドの連想リストを指定します。 キーの指定はkbdを使うのが安全*1なので、バッククオートを使いましょう。

ただし注意点があります。 第5引数のキーマップの設定を変更する場合は、overriding-minor-mode-mapを未定義にする必要があります。 1行目の末尾でC-x C-eを押してからdefine-minor-modeの式をC-M-xで評価します。

なお、特定のケースで無効にすることもできます。 以下はミニバッファでoverriding-minor-modeを無効にする例です。


(add-hook 'minibuffer-setup-hook (lambda () (overriding-minor-mode -1)))

*1:C-:はASCIIコード外なので "\C-:"はエラーになる。