Next: , Previous: , Up: Keymaps   [Contents][Index]


21.16 キーマップのスキャン

このセクションではすべてのカレントキーマップをスキャンして、ヘルプ情報をプリントするために使用される関数を説明します。

Function: accessible-keymaps keymap &optional prefix

この関数は、(0個以上のプレフィクスキーを通じて)keymapから到達可能なすべてのキーマップのリストをリターンする。リターン値は(key . map)のような形式の要素をもつ連想配列(alist)である。ここでkeykeymap内での定義がmapであるようなプレフィクスキーである。

alistの要素はkeyの長さにたいして昇順にソートされている。1つ目の要素は常に([] . keymap)。これは指定されたキーマップがイベントなしのプレフィクスによって、自分自身からアクセス可能だからである。

prefixが与えられたら、それはプレフィクスキーシーケンスである。その場合にはprefixで始まるプレフィクスキーをもつサブマップだけがaccessible-keymapsに含まれる。これらの要素の意味は(accessible-keymaps)の値の場合と同様であり、いくつかの要素が省略されている点だけが異なる。

以下の例ではリターンされるalistにより‘^[’と表示されるキーESCがプレフィクスキーであり、その定義がsparseキーマップ(keymap (83 . center-paragraph) (115 . foo))であることが示される。

(accessible-keymaps (current-local-map))
⇒(([] keymap
      (27 keymap   ; 以降ESCにたいするこのキーマップが繰り返されることに注意
          (83 . center-paragraph)
          (115 . center-line))
      (9 . tab-to-tab-stop))

   ("^[" keymap
    (83 . center-paragraph)
    (115 . foo)))

また以下の例ではC-h(keymap (118 . describe-variable)…)で始まるsparseキーマップを使用するプレフィクスキーである。他のプレフィクスC-x 4は変数ctl-x-4-mapの値でもあるキーマップを使用する。イベントmode-lineはウィンドウの特別な箇所でのマウスイベントにたいするプレフィクスとして使用される、いくつかのダミーイベントのうちの1つである。

(accessible-keymaps (current-global-map))
⇒ (([] keymap [set-mark-command beginning-of-line …
                   delete-backward-char])
    ("^H" keymap (118 . describe-variable) …
     (8 . help-for-help))
    ("^X" keymap [x-flush-mouse-queue …
     backward-kill-sentence])
    ("^[" keymap [mark-sexp backward-sexp …
     backward-kill-word])
    ("^X4" keymap (15 . display-buffer) …)
    ([mode-line] keymap
     (S-mouse-2 . mouse-split-window-horizontally) …))

これらが実際に目にするであろうキーマップのすべてではない。

Function: map-keymap function keymap

関数map-keymapkeymap内のバインディングそれぞれにたいして1回functionを呼び出す。呼び出す際の引数はイベント型と、そのバインディングの値の2つ。keymapに親キーマップがあれば、その親キーマップのバインディングも含まれる。これは再帰的に機能する。つまりその親キーマップ自身が親キーマップをもてば、それのバインディングも含まれる、といった具合である。

これはキーマップ内のすべてのバインディングを検証するもっとも明快な方法である。

Function: where-is-internal command &optional keymap firstonly noindirect no-remap

この関数はwhere-isコマンド(Help in The GNU Emacs Manualを参照)により使用されるサブルーチンである。これはキーマップのセット内でcommandにバインドされる、(任意の長さの)キーシーケンスすべてのリストをリターンする。

引数commandには任意のオブジェクトを指定できる。このオブジェクトはすべてのキーマップエントリーにたいして、eqを使用して比較される。

keymapnilなら、overriding-local-mapの値とは無関係に(overriding-local-mapの値がnilであると装って)、カレントアクティブキーマップをマップとして使用する。keymapがキーマップならkeymapとグローバルキーマップが検索されるマップとなる。keymapがキーマップのリストなら、それらのキーマップだけが検索される。

keymapにたいする式としては、通常はoverriding-local-mapを使用するのが最善である。その場合にはwhere-is-internalは正にアクティブなキーマップを検索する。グローバルマップだけを検索するにはkeymapの値に(keymap)(空のキーマップ)を渡せばよい。

firstonlynon-asciiなら、値はすべての可能なキーシーケンスのリストではなく最初に見つかったキーシーケンスを表す単一のベクターとなる。firstonlytなら、値は最初のキーシーケンスだが全体がASCII文字(またはメタ修飾されたASCII文字)で構成されるキーシーケンスが他のすべてのキーシーケンスに優先されて、リターン値がメニューバインディングになることは決してない。

noindirectが非nilの場合、where-is-internalはインダイレクトキーマップ(indirect keymap: 間接キーマップ)のバインディングを追跡しない。これにより、インダイレクト定義自体にたいして検索が可能になる。

5つ目の引数no-remapはこの関数がコマンドリマッピング(Remapping Commandsを参照)を扱う方法を決定する。興味深いケースが2つある:

コマンドother-commandcommandにリマップされる場合:

no-remapnilならother-commandにたいするバインディングを探して、commandにたいするバインディングであるかのようにそれらを扱う。no-remapが非nilならそれらのバインディングを探すかわりに、利用可能なキーシーケンスリストにベクター[remap other-command]を含める。

commandother-commandにリマップされる場合:

no-remapnilなら、commandではなくother-commandにたいするバインディングをリターンする。no-remapが非nilなら、リマップされていることを無視してcommandにたいするバインディングをリターンする。

Command: describe-bindings &optional prefix buffer-or-name

この関数はすべてのカレントキーバインディングのリストを作成して、*Help*という名前のバッファーにそれを表示する。テキストはモードごとにグループ化されて順番はマイナーモード、メジャーモード、グローバルバインディングの順である。

prefixが非nilなら、それはプレフィクスキーである。その場合にはリストに含まれるのはprefixで始まるキーだけになる。

複数の連続するASCIIコードが同じ定義をもつとき、それらは‘firstchar..lastchar’のようにまとめて表示される。この場合にはそれがどの文字に該当するかを理解するには、そのASCIIコードを知っている必要がある。たとえばデフォルトグローバルマップでは文字‘SPC .. ~’は1行で記述される。SPCASCIIの32,~ASCIIの126で、その間のすべての文字には通常のプリント文字(アルファベット文字や数字、区切り文字等)が含まれる。これらの文字はすべてself-insert-commandにバインドされる。

buffer-or-nameが非nilのならそれはバッファーかバッファー名である。その場合はdescribe-bindingsはカレントバッファーのかわりに、そのバッファーのバインディングをリストする。