特定のキーに強制的にコマンドを割り当てる方法
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-:"はエラーになる。