* ecomplete.el (ecomplete-display-matches): Use a local keymap to handle bindings.
authorKan-Ru Chen <kanru@kanru.info>
Thu, 6 Oct 2011 21:32:55 +0000 (23:32 +0200)
committerLars Magne Ingebrigtsen <larsi@stories.gnus.org>
Thu, 6 Oct 2011 21:32:55 +0000 (23:32 +0200)
lisp/ChangeLog
lisp/ecomplete.el

index ba5421b..a9ea580 100644 (file)
@@ -1,3 +1,8 @@
+2011-09-22  Kan-Ru Chen  <kanru@kanru.info>
+
+       * ecomplete.el (ecomplete-display-matches): Use a local keymap to
+       handle bindings.
+
 2011-10-06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus-win.el (gnus-configure-windows): Protect against reading
index 6a47b11..5d1c46b 100644 (file)
 (eval-when-compile
   (require 'cl))
 
+(eval-when-compile
+  (when (featurep 'xemacs)
+    ;; The `kbd' macro requires that the `read-kbd-macro' macro is available.
+    (require 'edmacro)))
+
 (defgroup ecomplete nil
   "Electric completion of email addresses and the like."
   :group 'mail)
            (message "%s" matches)
            nil)
        (setq highlight (ecomplete-highlight-match-line matches line))
-       (while (not (memq (setq command (read-event highlight)) '(? return)))
-         (cond
-          ((eq command ?\M-n)
-           (setq line (min (1+ line) max-lines)))
-          ((eq command ?\M-p)
-           (setq line (max (1- line) 0))))
-         (setq highlight (ecomplete-highlight-match-line matches line)))
-       (when (eq command 'return)
-         (nth line (split-string matches "\n")))))))
+       (let ((local-map (make-sparse-keymap))
+             selected)
+         (define-key local-map (kbd "RET")
+           (lambda () (setq selected (nth line (split-string matches "\n")))))
+         (define-key local-map (kbd "M-n")
+           (lambda () (setq line (min (1+ line) max-lines))))
+         (define-key local-map (kbd "M-p")
+           (lambda () (setq line (max (1- line) 0))))
+         (let ((overriding-local-map local-map))
+           (while (and (null selected)
+                       (setq command (read-key-sequence highlight))
+                       (lookup-key local-map command))
+             (apply (key-binding command) nil)
+             (setq highlight (ecomplete-highlight-match-line matches line))))
+         (if selected
+             (message selected)
+           (message "Abort"))
+         selected)))))
 
 (defun ecomplete-highlight-match-line (matches line)
   (with-temp-buffer