Next: Minibuffer Maps, Previous: Prefix Keymaps, Up: Key Bindings
これまではグローバルキーマップの諸側面について説明しました。 メジャーモード固有のキーバインディングを ローカルキーマップに定義することで、 各メジャーモードはEmacsの動作を変更します。 たとえば、Cモードでは、 <TAB>をCのコードの現在行を字下げする機能に差し替えます。 バッファ内の一部のテキストで、 そのバッファのメジャーモードのかわりとなる固有のキーマップを 指定することもできます。
マイナモードもローカルキーマップを持てます。 その場合、マイナモードが生きているときには、 そのキーマップがメジャーモードのローカルキーマップ やグローバルキーマップに優先します。
Lispモードおよびその他のいくつかのメジャーモードの
ローカルキーマップは、そのモードを使っていないときでもつねに存在します。
これらのキーマップは、lisp-mode-map
などの変数に格納されています。
さほど頻繁に使われないメジャーモードの場合は、
そのモードがセッションの中で初めて起動されたときに
ローカルキーマップが作られます。
これは、メモリを節約するためです。
このようなモードのキーマップを変更したい場合には、
当該メジャーモードのモードフックを使う必要があります(以下を参照)。
すべてのマイナモードのキーマップは、あらかじめ作られています。 マイナモードのキーマップ作成を そのマイナモードが最初に起動されるまで遅延させる方法はありません。
ローカルキーマップでは、その中のあるキーの定義をプレフィックスキーマップと することで、そのキーをローカルなプレフィックスキーとして再定義できます。 そのキーがグローバルにもプレフィックスキーであると定義されているなら、 ローカルキーマップとグローバルキーマップの内容は実質的に統合され、 プレフィックスキーに続くイベントは両方のキーマップで検索されます。 したがって、あるモードのローカルキーマップがC-cを 別のキーマップとして定義し、 そのキーマップではC-zをコマンドとして定義すると、 これらによってC-c C-zのローカルな意味が与えられます。 しかし、これはC-cで始まる他のキー列には影響しません。 あるキー列が独自のローカルなバインディングを持たなければ、 グローバルなバインディングが意味を持つからです。
いいかえれば、Emacsが複数イベントから成るキー列を扱う方法は、 複数のキーマップから1つずつ、キー列全体に一致するバインディングを探すのです。 まず、マイナモードが生きていればそのキーマップを検索し、 つぎにメジャーモードのキーマップを検索し、 最後にグローバルキーマップを検索します。 これは厳密にはキーの検索動作とは違いますが、 通常の状況でどうなるか理解するには十分です。
メジャーモードのローカルバインディングを変更するには、 そのモードのローカルキーマップを変更する必要があります。 通常、そのためにはそのモードが最初に使われるまで待つ必要があります。 というのは、ほどんどのメジャーモードは 使われるまでキーマップを作成しないからです。 ですから、個人の~/.emacsファイルで メジャーモードのバインディングを変更したければ、 そのモードのモードフックを使ってそのモードが最初に使われるまで (変更を)遅らせる必要があります。
たとえば、texinfoモードを選択するtexinfo-mode
コマンドは
フックtexinfo-mode-hook
を実行します。
このフックを使ってC-c nとC-c pに対する
(有益ではないですが)ローカルバインディングを
texinfoモードに追加するには、つぎのようにします。
(add-hook 'texinfo-mode-hook '(lambda () (define-key texinfo-mode-map "\C-cp" 'backward-paragraph) (define-key texinfo-mode-map "\C-cn" 'forward-paragraph) ))
See Hooks。