Next: , Up: Key Bindings


28.4.1 キーマップ

キー列とコマンド関数との対応はキーマップと呼ばれる データ構造に保持されています。 Emacsには数多くのキーマップがあり、それぞれが特定の場面で使われます。

キー列(または単にキー)とは、 ひとまとまりの意味を持つ入力イベントの並びをいいます。 入力イベントは、文字、ファンクションキー、マウスボタン、 つまり、端末から計算機に送ることができるすべての入力から成ります。 キー列の意味付けは、どのコマンドを実行するかを表す バインディングによって決まります。 キーマップの役割は、これらのバインディングを保持することです。

グローバルキーマップはもっとも重要なキーマップですが、 それはグローバルキーマップがつねに有効だからです。 グローバルキーマップは基本(fundamental)モードのキーを定義します。 つまり、そこに含まれる定義の大部分は、ほとんどまたはすべての メジャーモードに共通のものです。 各メジャー/マイナモードは、グローバルキーマップの定義の一部を 置き換えるような独自のキーマップを持つことができます。

たとえば、gのような自己挿入文字を打つとその文字がバッファに 挿入されるのは、グローバルキーマップでこれらのキーが self-insert-commandに対応付けられているからです。 また、C-aのような標準の編集コマンドも、 その意味付けはグローバルキーマップに書かれています。 M-x global-set-keyのようなバインディングを変更するコマンド群は、 グローバルキーマップの適切な箇所に新しいバインディングを書き込みます。

メタ文字はやや違った動作になります。 Emacsでは、メタ文字は<ESC>で始まる文字列に変換されます。 ですから、M-aという入力はつねにEmacsの中では <ESC> aに置き換えられて処理されます。 つまり、メタ文字は単一の入力イベントですが、 キーバインディングの観点では2つのイベントとして扱われます。 こうなっている理由は歴史的なもので、将来は変わる可能性もあります。

最近のほとんどのキーボードには、 文字キーの他にファンクションキーがあります。 ファンクションキーは文字キーと同様に入力イベントを送出し、 キーマップはそれに対応するバインディングを保持することができます。

多くの端末では、ファンクションキーを打つとコンピュータには 一連の文字列が送られます。 具体的にどのファンクションキーが どんな文字列を送るかは端末によってまちまちです。 (多くの場合、文字列は<ESC> [で始まる。) Emacsが使用中の端末種別を正しく認識していれば、 キー列(の先頭でだけでなく)に現れるファンクションキーに対応した 文字列を正しく判別できます。 ですから、多くの場合、ファンクションキーの打鍵も 1つの入力イベントとして直接Emacsに送られているとみなして、 文字列としての表現形式は無視してかまいません。

マウスボタンも入力イベントを発生させます。 これらのイベントには、追加データ、つまり、 ボタンを押したり放したりしたときのウィンドウとその中での位置、時刻 が付属しています。 ただし、キーバインディングに関しては、 どのボタンが使われたかだけが問題となります。 残りの情報は、コマンドがこれらの情報を参照する場合だけ意味を持ちます。 (通常、マウスから起動できるコマンドは、これらの情報を参照する。)

キーマップは1つのイベントに対する定義のみを保持します。 複数キーの列から成る複数のイベントの解釈には、 キーマップの連鎖が使われます。 最初のキーマップが最初のイベントの定義を保持し、 その定義がつぎのキーマップになっていて、 2番目のイベントの定義を保持し、というようになっています。

キー列にはファンクションキーと文字キーとが混ざっていてもかまいません。 たとえば、C-x <SELECT>というのも許されます。 <SELECT>をプレフィックスキーとして定義しておけば、 <SELECT> C-nというのも許されます。 マウスイベントとキーボードイベントを混ぜることさえ可能ですが、 そうすると打ち込むのが面倒ですからお勧めしません。

ユーザーはどんなキー列でも再定義して利用できますが、 C-cに続けて1文字というキー列だけを使うのが最善です。 このキー列は『ユーザー定義のために予約』されていて、 正しく設計されたEmacsの各種拡張とは衝突しないようになっているからです。 <F5>から<F9>までのファンクションキーも ユーザー定義のために予約してあります。 これ以外のキー列を再定義すると、 同じキーを再定義する拡張やメジャーモードによって あなたの定義が上書きされてしまう可能性があります。