]> code.delx.au - gnu-emacs/blobdiff - lisp/gnus/ecomplete.el
message-strip-subject-trailing-was: Refactor
[gnu-emacs] / lisp / gnus / ecomplete.el
index 33d2ddd6a7150c203b07d1aa14e392639a3b8466..cb50cce605683bccf7b9993a14514dfe01a54d6e 100644 (file)
@@ -1,6 +1,6 @@
 ;;; ecomplete.el --- electric completion of addresses and the like
 
-;; Copyright (C) 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+;; Copyright (C) 2006-2016 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: mail
 (eval-when-compile
   (require 'cl))
 
-(eval-when-compile
-  (unless (fboundp 'with-no-warnings)
-    (defmacro with-no-warnings (&rest body)
-      `(progn ,@body))))
-
 (defgroup ecomplete nil
   "Electric completion of email addresses and the like."
   :group 'mail)
 
 (defun ecomplete-add-item (type key text)
   (let ((elems (assq type ecomplete-database))
-       (now (string-to-number
-             (format "%.0f" (if (and (fboundp 'float-time)
-                                     (subrp (symbol-function 'float-time)))
-                                (float-time)
-                              (with-no-warnings
-                                (time-to-seconds (current-time)))))))
+       (now (string-to-number (format "%.0f" (float-time))))
        entry)
     (unless elems
       (push (setq elems (list type)) ecomplete-database))
            (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