Next: , Previous: Keymap Terminology, Up: Keymaps


21.2 キーマップの形式

キーマップは、そのcarがシンボルkeymapであるリストです。 リストの残りの要素がキーマップのキーバインディングを定義します。 オブジェクトがキーマップであるかどうか検査するには、 関数keymapp(下記参照)を使います。

キーマップでは、シンボルkeymapのうしろに、 さまざまな種類の要素が現れます。

(type . binding)
イベント型typeに対する1つのバインディングを指定する。 普通の各バインディングは、文字やシンボルである特定のイベント型に 適用される。 see Classifying Events
(t . binding)
デフォルトのキーバインディングを指定する。 キーマップの他の要素に一致しない任意のイベントには、 そのバインディングとして指定したbindingを与える。 デフォルトのバインディングにより、 すべてを列挙せずに可能なすべてのイベントにバインドできる。 デフォルトのバインディングを有するキーマップは、 任意の低優先順位のキーマップを隠してしまう。
vector
キーマップの要素がベクトルであると、 当該ベクトルをASCII文字全体、つまり、コード0から127に対する バインディングとみなす。 ベクトルのn番目の要素は、コードnの文字に対する バインディングである。 これは、多くのバインディングを記録するコンパクトな方法である。 このようなベクトルのキーマップを完全なキーマップ(full keymap)と呼ぶ。 それ以外のキーマップを疎なキーマップ(sparse keymaps)と呼ぶ。

キーマップにベクトルがあると、ベクトルの要素がnilであっても ベクトルが各ASCII文字のバインディングをつねに定義する。 そのようなnilのバインディングは、 ASCII文字に対しては キーマップのデフォルトのキーバインディングを無効にする。 しかし、ASCII文字以外のイベントに対しては、 デフォルトのバインディングが意味を持つ。 nilのバインディングが 低優先順位のキーマップを隠すことはない。 つまり、ローカルマップがnilのバインディングを与えると、 Emacsはグローバルマップのバインディングを使う。

string
バインディングに加えて、 キーマップでは、要素として文字列を持つこともできる。 これを全面プロンプト文字列(overall prompt string)と呼び、 キーマップをメニューとして使うことを可能にする。 see Menu Keymaps

キーマップは、メタ文字に対するバインディングを直接には記録していません。 そのかわりに、キー探索においては、メタ文字は2文字から成る列とみなし、 先頭文字は<ESC>(あるいは、meta-prefix-charの現在値)です。 つまり、キーM-aは実際には<ESC> aと表現され、 そのグローバルなバインディングは esc-mapaでみつかります(see Prefix Keys)。

Lispモードに対するローカルキーマップの例を示します。 これは疎なキーマップです。 <DEL>、<TAB>、C-c C-lM-C-qM-C-xに対する バインディングを定義しています。

     lisp-mode-map
     (keymap
      ;; <TAB>
      (9 . lisp-indent-line)
      ;; <DEL>
      (127 . backward-delete-char-untabify)
      (3 keymap
         ;; C-c C-l
         (12 . run-lisp))
      (27 keymap
     
          ;; M-C-q<ESC> C-qとみなされる
          (17 . indent-sexp)
     
          ;; M-C-x<ESC> C-xとみなされる
          (24 . lisp-send-defun)))
— Function: keymapp object

この関数は、objectがキーマップであればtを返し、 さもなければnilを返す。 より正確には、この関数は、 そのcarkeymapであるリストかどうかを検査する。

          (keymapp '(keymap))
               t
          (keymapp (current-global-map))
               t