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


21.16 Scanning Keymaps

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

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-keymapは、keymap内のバインディングそれぞれにたいして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]を含める。

If command is remapped to other-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はカレントバッファーのかわりに、そのバッファーのバインディングをリストする。