Go to the first, previous, next, last section, table of contents.

キーマップ

文字とコマンド関数の間の結び付きは,キーマップと呼ばれるデータ構造に記 録されています.Emacsはこのマップを数多く持っています.その1つである グローバル・キーマップは主モードに関係なく定義されている単一文字の 意味を定義しています.これは変数global-mapの値です.

各主モードには別のキーマップとしてローカル・キーマップを持ってお り,そのモードで再定義された単一文字については,ローカル・キーマップでの 定義が優先されます.それぞれのバッファはいつでもどのローカル・キーマップ がそのバッファで使われているかを記録しています.カレントバッファのローカ ル・キーマップがコマンドの実行に直接影響を与える唯一のものとなります. Lispモード,Cモード及び他の多くの主モード用のローカル・キーマップは使用 しないときでも常に存在します.それらはlisp-mode-mapc-mode-mapなどの変数の値です.それほど頻繁には使用しない主モード については,そのセッションではじめてそのモードが使用されたときに,ローカ ル・キーマップを作るようにして,記憶領域を節約しています.

ミニバッファ用にもローカル・キーマップがあります.そこには,いろいろな 補完の扱いや終了コマンドなどがあります.

また各接頭辞キーは,そのキーで始まるキーの列を定義するキーマップを持っ ています.たとえば,ctl-x-mapC-xに続く文字に使われるキー マップです.

接頭辞キーの定義は引き続く文字を引くためのキーマップにすぎません.実際 には,引き続く文字のキーマップを関数定義としたLispシンボルのこともありま す.働きは同じですが,こうするとその接頭辞キーにコマンド名を与えて,その 接頭辞の動作を表すようにすることができます.C-xはシンボル Ctl-X-Prefixに結び付いていて,その関数定義はC-xコマンドのキー マップであるctl-x-mapの値です.

この種の接頭辞キーの定義は,グローバル・マップとローカル・マップのどち らに現われてもかまいません.C-cC-xC-h,及び ESCの接頭辞キーとしての定義はグローバル・マップに現われますので, これらの接頭辞キーはいつでも使えます.接頭辞キーの定義をローカル・マップ に設ければ,主モードごとにローカルにキーを接頭辞のキーとして定義できます.

あるモードのローカル・マップに,C-xのようなグローバルな接頭辞の 接頭辞定義を置くことも可能です.これによって,C-xで始まるキーの定 義を主モードのそのキーの定義を優先にするようにできます.このケースは特殊 です.なぜならローカルな定義は完全にはグローバルな定義に置き換わることは ないからです.グローバルおよびローカルなキーの定義が異なったキーマップな ら,次の文字についてそう法のキーマップを調べます.通常のように,ローカル な定義がグローバルな定義よりも優先されます.したがって,C-xに続く 文字はC-xコマンドを再定義した主モードのローカルなキーマップと ctl-x-mapの両方で探されます.C-xコマンドに対する主モードの キーマップがnilのときはC-xコマンドに対するグローバル・キー マップの定義が使われます.

キーマップは実際にはLispのオブジェクトです.もっとも簡単なキーマップの 形式は長さ128のLispベクタです.このようなキーマップに置ける文字の結び付 きは,その文字をインデックスとしてベクタを引けば得られます.キーマップは Lispリストのこともあります.このリストのcar(第一要素)はシンボル keymapで残りの要素は(char . binding)の形をし た対です.こういったリストは疎なキーマップと呼ばれます.それは文字のエン トリのほとんどがnilであるときに使用されるからです.疎なキーマップ は主として接頭辞文字に使用されます.

キーマップは128の長さしかありません.128から255のコードのMeta文字につ いてはどうなのでしょうか?Meta文字を含むキーは実際にはESCで始まる2 つの文字の列として表現されます.従ってM-aキーは,実際には ESC aと表現されており,その結び付きは,esc-map注の `a'スロットにあります.


Go to the first, previous, next, last section, table of contents.