GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/Keymaps.html ・ emacs-doc.conao3.com

16.8 キーマップ

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のキーマップを参照してください。