いつでも使いたいキーバインドがある場合、初期化ファイルに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)
コマンドではなく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
のような低レベル関数に適した形式に変換します。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)))