次: , 前: Prefix Keymaps, 上: Key Bindings


28.4.3 ローカルキーマップ

これまではグローバルキーマップの諸側面について説明しました。 メジャーモード固有のキーバインディングを ローカルキーマップに定義することで、 各メジャーモードは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 nC-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