Next: , Previous: , Up: キーバインディングのカスタマイズ   [Contents][Index]


50.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)

ASCII文字にたいするキーバインディングは、言語とコーディングシステムに問題を起こすかもしれません。 initファイル内の非ASCII文字を参照してください。

かわりに低レベル関数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)