常に使用したいキーバインドのセットがある場合は、初期化ファイルに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)))