define-key で多ストロークを設定

keymap というのは car が editor:keymap とゆー symbol で、cdr が (key . command) の alist らしい。

(setq *keymap* (make-sparse-keymap))
=> (keymap)

(define-key *keymap* #\C-b 'command)
=> t

*keymap*
=> (keymap (#\C-b . command))

んで、多ストローク

(define-key *keymap* '(#\C-x #\C-g) 'hello)
=> t

*keymap*
=> (keymap (#\C-x keymap (#\C-g . hello)) (#\C-b . command))

ふむ。その key に bind された command として keymap を突っ込んであるようだ。

(lookup-keymap *keymap* #\C-x)
=> (keymap (#\C-g . hello))

(cdr (assoc #\C-x (cdr *keymap*)))
=> (keymap (#\C-g . hello))

つまりこんなことをしてるんだろう。

(defun define-key~ (keymap key command)
  (if (consp key)
      (let ((second-map (cdr (assoc (car key) keymap))))
        (unless (keymapp second-map)
          (setq second-map (make-sparse-keymap)))
        (define-key~ second-map (cadr key) command)
        (define-key~ keymap (car key) second-map))
    (let ((place (assoc key (cdr keymap))))
      (if place
          (setf (cdr place) command)
        (let ((last (last keymap)))
          (setf (cdr last) (list (cons key command)))))))
  t)