Next: Remapping Commands, Previous: Functions for Key Lookup, Up: Keymaps [Contents][Index]
キーのリバインド(rebind:
再バインド、再束縛)は、キーマップ内でそのキーのバインディングエントリーを変更することにより行います。グローバルキーマップ内のバインディングを変更した場合、その変更は(たとえローカルバインディングによりグローバルバインディングをshadowしているバッファーでは直接影響しないとしても)すべてのバッファーに影響します。カレントバッファーのローカルマップを変更した場合は、通常は同じメジャーモードを使用するすべてのバッファーに影響します。関数global-set-key
およびlocal-set-key
は、これらの操作のための使いやすいインターフェイスです(Key Binding Commandsを参照)。より汎用的な関数define-key
を使用することもできます。その場合は、変更するマップを明示的に指定しなければなりません。
Lispプログラムでリバインドするキーシーケンスを選択するときは、さまざまなキーの使用についてのEmacsの慣習にしたがうようお願いします(Key Binding Conventionsを参照)。
リバインドするキーシーケンスの記述では、コントロール文字とメタ文字にたいして、特別なエスケープシーケンスを使用すると良いでしょう(String Typeを参照)。構文‘\C-’は後続する文字がコントロール文字でることを意味し、‘\M-’は後続する文字がメタ文字であることを意味します。したがって、文字列"\M-x"
は1つのM-x、"\C-f"
は1つのC-f、"\M-\C-x"
および"\C-\M-x"
は1つのC-M-xとして読み取られます。ベクター内でも、このエスケープシーケンス、および文字列では使用できない他のエスケープシーケンスを使用できます。1例は‘[?\C-\H-x
home]’です。Character Typeを参照してください。
キー定義、およびルックアップ関数は、ベクターであるようなキーシーケンス内のイベント型にたいして、別の構文を受け入れます。修飾名に基本イベント(文字かファンクションキー名)を付加したものを含むリストを使用できます。たとえば、(control
?a)
は?\C-a
、(hyper control
left)
はC-H-left
と等価です。このようなリストの利点の1つは、コンパイル済みファイル内に修飾ビットの正確な数値コードが出現しないことです。
以下の関数は、keymapがキーマップでない場合、およびkeyがキーシーケンスを表す文字列やベクターでない場合はエラーをシグナルします。リストであるようなイベントにたいする略記として、イベント型(シンボル)を使用できます。kbd
関数(Key Sequencesを参照)は、キーシーケンスを指定するための便利な方法です。
この関数は、keymap内でkeyにたいするバインディングをセットする(keyが長さ2以上のイベントの場合、その変更は実際はkeymapから辿られる他のキーマップで行なわれる)。引数bindingには任意のLispオブジェクトを指定できるが、意味があるのは特定のオブジェクトだけである(意味のある型のリストは、Key Lookupを参照のこと)。define-key
のリターン値はbindingである。
keyが[t]
の場合、これはkeymap内でデフォルトバインディングをセットする。イベントが自身のバインディングをもたないとき、そのキーマップ内にデフォルトバインディングが存在するなら、Emacsコマンドループはそれを使用する。
keyのすべてのプレフィクスは、プレフィクスキー(キーマップにバインドされる)、または未定義でなけらばならず、それ以外はエラーがシグナルされる。keyのいくつかのプレフィクスが未定義の場合は、define-key
はそれをプレフィクスキーとして定義するので、残りのkeyは指定されたように定義できる。
前にkeymap内でkeyにたいするバインディングが存在しなかった場合は、新たなバインディングがkeymapの先頭に追加される。キーマップ内のバインディングの順序はキーボード入力にたいし影響を与えないが、メニューキーマップにたいしては問題となる(Menu Keymapsを参照)。
以下は、sparseキーマップを作成して、その中にバインディングをいくつか作成する例である:
(setq map (make-sparse-keymap)) ⇒ (keymap)
(define-key map "\C-f" 'forward-char) ⇒ forward-char
map ⇒ (keymap (6 . forward-char))
;; C-xにたいしsparseサブマップを作成し、
;; その中でfをバインドする
(define-key map (kbd "C-x f") 'forward-word)
⇒ forward-word
map ⇒ (keymap (24 keymap ; C-x (102 . forward-word)) ; f (6 . forward-char)) ; C-f
;; C-pをctl-x-map
にバインド (define-key map (kbd "C-p") ctl-x-map) ;;ctl-x-map
⇒ [nil … find-file … backward-kill-sentence]
;; ctl-x-map
内でC-fをfoo
にバインド
(define-key map (kbd "C-p C-f") 'foo)
⇒ 'foo
map
⇒ (keymap ; ctl-x-map
内のfoo
に注目
(16 keymap [nil … foo … backward-kill-sentence])
(24 keymap
(102 . forward-word))
(6 . forward-char))
C-p
C-fにたいする新たなバインディングの格納は、実際にはctl-x-map
内のエントリーを変更することにより機能し、これはデフォルトグローバルマップ内のC-p
C-fとC-x C-fの両方のバインディングを変更する効果をもつことに注意されたい。
関数substitute-key-definition
は、キーマップから特定のバインディングをもつキーをスキャンして、それらを異なるバインディングにリバインドする。より明快で、多くの場合は同じ結果を生成できる他の機能として、あるコマンドから別のコマンドへのリマップがあります(Remapping Commandsを参照)。
この関数は、keymap内でolddefにバインドされるすべてのキーについて、olddefをnewdefに置き換える。別の言い方をすると、olddefが出現する箇所すべてをnewdefに置き換える。この関数はnil
をリターンする。
たとえば、以下をEmacsの標準バインディングで行うと、C-x C-fを再定義する:
(substitute-key-definition 'find-file 'find-file-read-only (current-global-map))
oldmapが非nil
の場合は、どのキーをリバインドするかをoldmap内のバインディングが決定するよう、substitute-key-definition
の動作を変更する。リバインディングは依然としてoldmapではなく、keymapで発生する。したがって、他のマップ内のバインディングの制御下で、マップを変更することができる。たとえば、
(substitute-key-definition 'delete-backward-char 'my-funny-delete my-map global-map)
これは、標準的な削除コマンドにグローバルにバインドされたキーにたいして、my-map
内の特別な削除コマンドを設定する。
以下は、キーマップの置き換え(substitution)の前後を示す例である:
(setq map '(keymap (?1 . olddef-1) (?2 . olddef-2) (?3 . olddef-1))) ⇒ (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
(substitute-key-definition 'olddef-1 'newdef map) ⇒ nil
map ⇒ (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
この関数は、self-insert-command
をコマンドundefined
にリマップ(Remapping Commandsを参照)することにより、fullキーマップのコンテンツを変更する。これは、すべてのプリント文字を未定義にする効果をもすので、通常のテキスト挿入は不可能になる。suppress-keymap
はnil
をリターンする。
nodigitsがnil
の場合、suppress-keymap
は数字がdigit-argument
、-がnegative-argument
を実行するように定義する。それ以外は、残りのプリント文字と同じように、それらの文字も未定義にする。
suppress-keymap
関数は、yank
やquoted-insert
のようなコマンドを抑制(suppress)しないので、バッファーの変更は可能である。バッファーの変更を防ぐには、バッファーを読み取り専用(read-only)にする(Read Only Buffersを参照)。
この関数はkeymapを変更するので、通常は新たに作成したキーマップにたいして使用するだろう。するだろう。他の目的のために使用されている既存のキーマップに操作を行うと、恐らくトラブルの原因となる。たとえば、global-map
の抑制は、Emacsの使用をほとんど不可能に
この関数は、テキストの挿入が望ましくないメジャーモードの、ローカルキーマップ初期科に使用され得る。しかし、そのようなモードは通常はspecial-mode
(Basic Major Modesを参照)から継承される。この場合、そのモードのキーマップは既に抑制済みのspecial-mode-map
から自動的に受け継がれる。以下にspecial-mode-map
が定義される方法を示す:
(defvar special-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (define-key map "q" 'quit-window) … map))
Next: Remapping Commands, Previous: Functions for Key Lookup, Up: Keymaps [Contents][Index]