Next: 修飾キー, Previous: 対話的なキーバインディングの変更, Up: キーバインディングのカスタマイズ [Contents][Index]
いつでも使いたいキーバインドがある場合、初期化ファイルにLispコードを記述することにより、それらを指定できます。初期化ファイルの説明については、Emacs初期化ファイルを参照してください。
Lipsを用いてキーバインディングを記述する際には、keymap-global-set
またはkeymap-set
のいずれかの関数を使用することをお薦めします。たとえば以下はグローバルキーマップにおいて、C-zにshell
コマンド(対話的なサブシェルを参照)をバインドする例です:
(keymap-global-set "C-z" 'shell)
keymap-global-set
の1つ目の引数にはキーシーケンスを記述します。これはスペースで区切られた一連の文字から構成される文字列であり、それぞれの文字がキーに対応しています。修飾されたキーは、たとえばControlキーなら‘C-’、Metaキーなら‘M-’のように、修飾キーを前に追加することによって指定できます。TABやRETのようなスペシャルキーの場合には、TABやRETのように山形カッコ(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-key
とglobal-set-key
を使うこともできます。たとえばこれらの低レベル関数を用いて、上記例のようにC-zにshell
コマンドをバインドするには:
(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
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)))