Next: 修飾キー, Previous: 対話的なキーバインディングの変更, Up: キーバインディングのカスタマイズ [Contents][Index]
いつでも使いたいキーバインドがある場合、初期化ファイルにLispコードを記述することにより、それらを指定できます。初期化ファイルの説明については、Emacs初期化ファイルを参照してください。
Lispを使用してキーバインディングを記述するには、いくつかの方法があります。一番簡単なのはkbd
関数を使う方法で、これはキーシーケンスのテキスト表現
— このマニュアルでキーシーケンスを記述するのと同様な方法 —
を、global-set-key
の引数として渡す形式に変換します。たとえば以下は、C-zをshell
コマンド(対話的なサブシェルを参照してください)にバインドする方法の例です:
(global-set-key (kbd "C-z") 'shell)
コマンド名shell
の前のシングルクォートは、それを変数ではなくシンボル定数としてマークします。クォートを省略した場合、Emacsはshell
を変数として評価しようとします。これはおそらくエラーを引き起こし、もちろんあなたはそれを望まないはずです。
以下に、ファンクションキーやマウスイベントなどを含めた、追加の例を示します:
(global-set-key (kbd "C-c y") 'clipboard-yank) (global-set-key (kbd "C-M-q") 'query-replace) (global-set-key (kbd "<f5>") 'flyspell-mode) (global-set-key (kbd "C-<f5>") 'display-line-numbers-mode) (global-set-key (kbd "C-<right>") 'forward-sentence) (global-set-key (kbd "<mouse-2>") 'mouse-save-then-kill)
キーシーケンスの指定に、kbd
ではなくLisp文字列やベクターを使うこともできます。文字列を使うほうが単純ですが、ASCII文字とMeta修飾されたASCII文字にたいしてのみ機能します。たとえば以下の方法ではmake-symbolic-link
(ファイルのコピー、命名、リネーム。を参照)にC-x M-lをバインドしています:
(global-set-key "\C-x\M-l" 'make-symbolic-link)
同様にコマンドではなくキーシーケンスにたいしてLisp文字列やベクターをバインドすることもできます。ベクターが必要になるのは意図する結果に非ASCII文字が含まれる場合だけであり、そのようなベクターの作成にもkbd
を使うことができます。たとえば文字列‘hello’にC-c
hをバインドするには:
(global-set-key (kbd "C-c h") "hello")
しかし文字列‘olá’にバインドするには:
(global-set-key (kbd "C-c h") (kbd "olá"))
TAB、RET、ESC、DELを含んだキーシーケンスをバインドするためには、その文字列にそれぞれ‘\t’、‘\r’、‘\e’、‘\d’というEmacs
Lispのエスケープシーケンスが含まれている必要があります。以下はindent-rigidly
(インデントを参照)にC-x TABをバインドする例です:
(global-set-key "\C-x\t" 'indent-rigidly)
ファンクションキーやマウスボタンイベント、あるいはC-=
やH-a
のような非ASCII文字をキーシーケンスに含めるには、キーシーケンスの指定にベクターを用いることができます。ベクターの要素はそれぞれ1つの入力イベントを意味しており、それらの要素は空白で区切られて角カッコのペアーで括られています。ベクターの要素が文字であればLispの文字定数(文字列内に表示される際の文字の前に‘?’を前置したフォーマット)として記述してください。ファンクションキーはシンボルとして表現されます(ファンクションキーのリバインドを参照)。単にそのシンボルの名前を記述します。他の区切り文字や句読点文字をつける必要はありません。以下に例を示します。
(global-set-key [?\C-=] 'make-symbolic-link) (global-set-key [?\M-\C-=] 'make-symbolic-link) (global-set-key [?\H-a] 'make-symbolic-link) (global-set-key [f7] 'make-symbolic-link) (global-set-key [C-mouse-1] 'make-symbolic-link)
単純なケースにたいしてもベクターを使用できます:
(global-set-key [?\C-x ?\M-l] 'make-symbolic-link)
非ASCII文字にたいするキーバインディングは、言語とコーディングシステムに問題を起こすかもしれません。 initファイル内の非ASCII文字を参照してください。
ローカルキーマップで説明したように、メジャーモードとマイナーモードはローカルキーマップを定義できます。これらのキーマップは、セッションで最初にそのモードがロードされるときに構築されます。特定のキーマップで変更を行うために関数define-key
を使用できます。この関数にバインディングとしてnil
を渡せばキーバインディングの削除(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 () (define-key texinfo-mode-map "\C-cp" 'backward-paragraph) (define-key texinfo-mode-map "\C-cn" 'forward-paragraph))) (define-key texinfo-mode-map "\C-c\C-xx" nil)