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

51.3.6 Initファイルでのキーの再割り当て

常に使用したいキーバインドのセットがある場合は、初期化ファイルにLispコードを記述することで指定できます。初期化ファイルの説明については、Emacs初期化ファイルを参照してください。

Lispでキーバインドを記述する際の推奨方法は、keymap-global-set または keymap-set 関数のいずれかを使用することです。例えば、グローバルキーマップで C-z を shell コマンドにバインドする方法は以下の通りです(インタラクティブ・サブシェルを参照):

(keymap-global-set "C-z" 'shell)

keymap-global-set の第1引数はキーシーケンスを記述します。これはスペースで区切られた一連の文字からなる文字列であり、各文字が1つのキーに対応します。修飾子付きのキーは、修飾子を先頭に付加することで指定でき、例えば Control には ‘C-’、Meta には ‘M-’ のように記述します。TAB や RET などの特殊キーは、TAB や RET のように山括弧で囲んで指定できます。

キーシーケンスにバインドされるコマンド名の前にあるシングルクォート(上記の例では shell)は、それを変数ではなく定数シンボルとして指定します。クォートを省略すると、Emacsは shell を変数として評価しようとします。これはおそらくエラーの原因になりますし、間違いなく意図した動作ではありません。

ファンクションキーやマウスイベントのバインドなど、追加の例をいくつか挙げます:

(keymap-global-set "C-c y" 'clipboard-yank)
(keymap-global-set "C-M-q" 'query-replace)
(keymap-global-set "<f5>" 'flyspell-mode)
(keymap-global-set "C-<f5>" 'display-line-numbers-mode)
(keymap-global-set "C-<right>" 'forward-sentence)
(keymap-global-set "<mouse-2>" 'mouse-save-then-kill)

キーシーケンスは、コマンドではなくLisp文字列に直接バインドすることも可能です。こうした文字列は、キーシーケンスと同じ構文で記述します。例えば、C-c hを文字列‘hello’にバインドするには:

(keymap-global-set "C-c h" "h e l l o")

これは記述がやや煩雑なため、代わりに利便性関数 key-description を使うことができます:

(keymap-global-set "C-c h" (key-description "hello"))

非ASCII文字は、文字列内で直接指定できます。 例えば ‘olá’ にバインドするには、次のようにします。

(keymap-global-set "C-c h" (key-description "olá"))

ただし、言語やコーディング体系によっては、非ASCII文字のキーバインドに問題が生じる可能性があることに注意してください(Initファイルにおける非ASCII文字を参照)。Unicodeコードポイントを用いて直接バインドを記述すれば、こうした問題を回避できます(Emacs内で文字のコードポイントを特定する方法については、国際文字セット入門を参照してください):

(keymap-global-set "C-c h" (key-description "ol\u00E1"))

あるいは、低レベル関数 define-key および global-set-key を使用することもできます。例えば、上記の例のように C-z を shell コマンドにバインドするには、これらの低レベル関数を用いて次のように記述します。

(global-set-key (kbd "C-z") 'shell)

キーシーケンスを指定する方法はいくつかありますが、最も簡単なのは、上記の例のように関数 kbd を使用することです。kbd は、キーシーケンスをテキスト形式で表した単一の文字列引数を受け取り、それを global-set-key などの低レベル関数に適した形式に変換します。Lisp を用いたキーバインドの詳細については、The Emacs Lisp Reference Manual の Keymaps を参照してください。

ローカルキーマップで説明されている通り、メジャーモードやマイナーモードではローカルキーマップを定義できます。これらのキーマップは、セッション内でそのモードが初めてロードされた際に構築されます。特定のキーマップに変更を加えるには、keymap-set関数を使用できます。キーバインドを削除するには、keymap-unsetを使用してください。

モードのキーマップはロードされるまで構築されないため、キーマップを変更するコードの実行は、例えばモードフックに配置するなどして遅らせる必要があります(フックを参照)。例えば、Texinfoモードではフック texinfo-mode-hook が実行されます。以下に、フックを使用してTexinfoモードで C-c n と C-c p のローカルバインディングを追加し、C-c C-x x のバインディングを削除する方法を示します。

(add-hook 'texinfo-mode-hook
          (lambda ()
            (keymap-set texinfo-mode-map "C-c p"
                        'backward-paragraph)
            (keymap-set texinfo-mode-map "C-c n"
                        'forward-paragraph)
            (keymap-set texinfo-mode-map "C-c C-x x" nil)))