(rmail-last-rmail-file): Initialize to a file name.
[bpt/emacs.git] / lisp / subr.el
index e7bc2e1..031c7ff 100644 (file)
@@ -186,10 +186,14 @@ in KEYMAP as NEWDEF those chars which are defined as OLDDEF in OLDMAP."
 This is like `define-key' except that the binding for KEY is placed
 just after the binding for the event AFTER, instead of at the beginning
 of the map.
-The order matters when the keymap is used as a menu."
+The order matters when the keymap is used as a menu.
+KEY must contain just one event type--it must be a string or vector
+of length 1."
   (or (keymapp keymap)
       (signal 'wrong-type-argument (list 'keymapp keymap)))
-  (let ((tail keymap) done
+  (if (> (length key) 1)
+      (error "multi-event key specified in `define-key-after'"))
+  (let ((tail keymap) done inserted
        (first (aref key 0)))
     (while (and (not done) tail)
       ;; Delete any earlier bindings for the same key.
@@ -197,11 +201,20 @@ The order matters when the keymap is used as a menu."
          (setcdr tail (cdr (cdr tail))))
       ;; When we reach AFTER's binding, insert the new binding after.
       ;; If we reach an inherited keymap, insert just before that.
+      ;; If we reach the end of this keymap, insert at the end.
       (if (or (eq (car-safe (car tail)) after)
-             (eq (car tail) 'keymap))
+             (eq (car (cdr tail)) 'keymap)
+             (null (cdr tail)))
          (progn
-           (setcdr tail (cons (cons (aref key 0) definition) (cdr tail)))
-           (setq done t)))
+           ;; Stop the scan only if we find a parent keymap.
+           ;; Keep going past the inserted element
+           ;; so we can delete any duplications that come later.
+           (if (eq (car (cdr tail)) 'keymap)
+               (setq done t))
+           ;; Don't insert more than once.
+           (or inserted
+               (setcdr tail (cons (cons (aref key 0) definition) (cdr tail))))
+           (setq inserted t)))
       (setq tail (cdr tail)))))
 
 (defun keyboard-translate (from to)
@@ -214,7 +227,8 @@ and then modifies one entry in it."
          (> to   (length keyboard-translate-table)))
       (progn
        (let* ((i (length keyboard-translate-table))
-              (table (make-string (- 256 i) 0)))
+              (table (concat keyboard-translate-table
+                             (make-string (- 256 i) 0))))
          (while (< i 256)
            (aset table i i)
            (setq i (1+ i)))
@@ -350,7 +364,9 @@ as returned by the `event-start' and `event-end' functions."
 POSITION should be a list of the form
    (WINDOW BUFFER-POSITION (COL . ROW) TIMESTAMP)
 as returned by the `event-start' and `event-end' functions."
-  (nth 1 position))
+  (if (consp (nth 1 position))
+      (car (nth 1 position))
+    (nth 1 position)))
 
 (defsubst posn-col-row (position)
   "Return the row and column in POSITION.