Next: , Previous: Key Binding Commands, Up: Keymaps


21.11 キーマップの走査

本節では、ヘルプ情報を表示するために 現在のキーマップをすべて走査する関数について述べます。

— Function: accessible-keymaps keymap &optional prefix

この関数は、keymapから(0個以上のプレフィックスキーにより)辿れる すべてのキーマップのリストを返す。 その値は、(key . map)の形の要素から成る 連想リストである。 ここで、keyはプレフィックスキーであり、 keymap内でのその定義はmapである。

連想リスト内での要素の順番は、keyの長さが増える順である。 指定したキーマップkeymapはプレフィックスのイベントなしに参照できるので、 最初の要素はつねに("" . keymap)である。

prefixを与える場合、それはプレフィックスキー列であること。 すると、accessible-keymapsは、 prefixで始まるプレフィックスに対応したサブマップのみを含める。 それらの要素は、(accessible-keymaps)の値と同じに見えるが、 違いは、いくつかの要素が省略されることである。

つぎの例では、返された連想リストにおいては、 ‘^[’と表示されたキー<ESC>はプレフィックスキーであり、 その定義は疎なキーマップ (keymap (83 . center-paragraph) (115 . foo))であることを表す。

          (accessible-keymaps (current-local-map))
          ⇒(("" keymap
                (27 keymap   ; Note this keymap for <ESC> is repeated below.
                    (83 . center-paragraph)
                    (115 . center-line))
                (9 . tab-to-tab-stop))
          
             ("^[" keymap
              (83 . center-paragraph)
              (115 . foo)))

つぎの例では、C-hは、 疎なキーマップ(keymap (118 . describe-variable)...)を 使うプレフィックスキーである。 別のプレフィックス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: where-is-internal command &optional keymap firstonly noindirect

この関数は、コマンドwhere-is (see ヘルプ機能)が使う サブルーティンである。 キーマップにおいてcommandにバインドされた (任意長の)キー列のリストを返す。

引数commandは任意のオブジェクトであり、 キーマップ項目とはeqで比較する。

keymapnilであると、 overriding-local-mapを無視 (つまり、その値はnilとみな)して、 現在活性なキーマップを使う。 keymapnil以外であると、 keymapとグローバルキーマップから辿れるキーマップを使う。

通常、keymapに対する式にはoverriding-local-mapを使うのが 最良である。 そうすると、where-is-internalは正確に活性なキーマップを走査する。 グローバルキーマップのみを走査するには、 keymapとして(keymap)(空のキーマップ)を渡す。

firstonlynon-asciiであると、 戻り値は、可能なキー列のリストではなく、 最初にみつかったキー列を表す1つの文字列である。 firstonlytであると、 値は最初のキー列であるが、 ASCII文字(あるいはASCII文字のメタ変種)のみから成るキー列が 他のキー列より優先される。

noindirectnil以外であると、 where-is-internalは間接項目を辿らない。 これにより、間接項目そのものを探すことができる。

          (where-is-internal 'describe-function)
              ⇒ ("\^hf" "\^hd")
— コマンド: describe-bindings &optional prefix

この関数は、現在のすべてのキーバインディングの一覧を作成し、 ‘*Help*’という名前のバッファに表示する。 テキストはモードごとにまとめられ、 マイナモード、メジャーモード、グローバルバインディングの順である。

prefixnil以外であると、それはプレフィックスキーであること。 そうすると、prefixで始まるキーのみの一覧を作る。

一覧では、メタ文字は、<ESC>に続けて対応する非メタ文字で表す。

連続したASCIIコードの一連の文字が同じ定義である場合には、 それらをまとめて‘firstchar..lastchar’と表示する。 この場合、どの文字であるか理解するには、 ASCIIコードを知っている必要がある。 たとえば、デフォルトのグローバルキーマップでは、 ‘<SPC>.. ~’の文字が1行に表示される。 <SPC>はASCIIコード32、~ASCIIコード126であり、 そのあいだには普通の印字文字(英文字、数字文字、句読点文字など)が すべて含まれる。 これらの文字はすべてself-insert-commandにバインドされている。