Emacsでは、どのキーがどのコマンドを呼び出すかを記録するためにキーマップを使用します。keymap-global-setを使用してEmacsのあらゆる箇所で単一のコマンドのキーバインドを設定する場合、current-global-mapでそのキーバインドを指定することになります。
Cモードやテキストモードなどの特定のモードには、それぞれ独自のキーマップが用意されており、モード固有のキーマップは、すべてのバッファで共有されるグローバルマップよりも優先されます。
keymap-global-set
関数は、グローバルキーマップをバインド、または再バインドします。例えば、以下はキー C-x C-b を関数
buffer-menu にバインドします:
(keymap-global-set "C-x C-b" 'buffer-menu)
モード固有のキーマップは、特定のキーマップを引数として受け取る keymap-set
関数を用いて、キーとコマンドを指定してバインドします。例えば、以下の式は texinfo-insert-@group コマンドを C-c C-c
g にバインドします:
(keymap-set texinfo-mode-map "C-c C-c g" 'texinfo-insert-@group)
従来、キーマップは現在はレガシーとされる低レベル関数 define-key
を用いてバインドされていました。keymap-set の使用が推奨されますが、さまざまな箇所で
define-key を目にすることがあるでしょう。上記のキーバインドは、define-key を用いて次のように書き換えることができます:
(define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@group)
texinfo-insert-@group 関数自体は、Texinfo ファイルに
‘@group’ を挿入する Texinfo
モードのちょっとした拡張機能です。私はこのコマンドをいつも使っており、6ストロークの @ g r o u
p よりも3ストロークの C-c C-c g
を入力する方を好みます。(‘@group’ とそれに対応する
‘@end group’
は、囲まれたすべてのテキストを1ページにまとめるコマンドです。本書にある多くの複数行の例は、‘@group … @end group’ で囲まれています。)
以下がtexinfo-insert-@groupの関数定義です:
(defun texinfo-insert-@group () "Insert the string @group in a Texinfo buffer." (interactive) (beginning-of-line) (insert "@group\n"))
(もちろん、単語を挿入する関数を書く代わりに、Abbrevモードを使って入力の手間を省くこともできたでしょう。ですが、他のTexinfoモードのキーバインドと整合性の取れたキー操作の方が好みです。)
loaddefs.el のほか、cc-mode.el や lisp-mode.el
といった各種モードライブラリにおいても、数多くの keymap-set や define-key 式を目にすることになります。
キーマップの詳細については、The GNU Emacs Manualのキーバインドのカスタマイズ、およびThe GNU Emacs Lisp Reference Manualのキーマップを参照してください。