51.3.6 initファイル内でのキーのリバインド

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

Lipsを用いてキーバインディングを記述する際には、keymap-global-setまたはkeymap-setのいずれかの関数を使用することをお薦めします。たとえば以下はグローバルキーマップにおいて、C-zshellコマンド(対話的なサブシェルを参照)をバインドする例です:

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

keymap-global-setの1つ目の引数にはキーシーケンスを記述します。これはスペースで区切られた一連の文字から構成される文字列であり、それぞれの文字がキーに対応しています。修飾されたキーは、たとえばControlキーなら‘C-’、Metaキーなら‘M-’のように、修飾キーを前に追加することによって指定できます。TABRETのようなスペシャルキーの場合には、TABRETのように山形カッコ(angle brackets)の中に記述することによって指定することができます。

上記例でキーシーケンスにバインドされるコマンド名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-keyglobal-set-keyを使うこともできます。たとえばこれらの低レベル関数を用いて、上記例のようにC-zshellコマンドをバインドするには:

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

キーシーケンスの指定にはさまざまな方法が存在しますが、上記例で示した関数kbdを使うのがもっともシンプルな方法です。kbdは単一の文字列引数としてキーシーケンスのテキスト表現を受け取り、global-set-keyのような低レベル関数に適した形式に変換します。Lipsにおけるキーのバインディングと使用に関する詳細については、Keymaps in The Emacs Lisp Reference Manualを参照してください。

ローカルキーマップで説明したように、メジャーモードとマイナーモードはローカルキーマップを定義できます。これらのキーマップは、セッションで最初にそのモードがロードされるときに構築されます。特定のキーマップに変更を施すには、関数keymap-setを使用できます。キーバインディングの削除にはkeymap-unsetを使用します。

モードのキーマップはモードがロードされるまで構築されないので、キーマップを変更するコードをモードフック(mode hook)に配置することにより実行を遅延しなければなりません(フックを参照)。たとえばTexinfoモードは、フックtexinfo-mode-hookを実行します。以下はTexinfoモードでC-c nC-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)))
This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.