Make completing-read function configurable
authorFlorian Ragwitz <rafl@debian.org>
Tue, 28 Sep 2010 19:24:45 +0000 (21:24 +0200)
committerJulien Danjou <julien@danjou.info>
Wed, 29 Sep 2010 18:17:13 +0000 (20:17 +0200)
Also provide some default implementations using completing-read,
iswitchb, and ido-completing-read.

Signed-off-by: Julien Danjou <julien@danjou.info>
lisp/ChangeLog
lisp/gnus-util.el

index d7eb78c..78f54c5 100644 (file)
        `gnus-faces-properties-alist'.
        Add :version property.
 
+2010-09-28  Florian Ragwitz  <rafl@debian.org>
+
+       * gnus-util.el (gnus-use-ido): Removed.
+       (gnus-std-completing-read): Add wrapper around completing-read.
+       (gnus-icompleting-read): Add wrapper around ibuffer-read-buffer.
+       (gnus-ido-completing-read): Add wrapper around ido-completing-read.
+       (gnus-completing-read-function): Add to chose from the above completion
+       functions or to provide a custom one.
+       (gnus-completing-read): Use the completing-read function configured
+       with gnus-completing-read-function.
+
 2010-09-28  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * mail-source.el (mail-source-report-new-mail)
index d188eba..1c390c7 100644 (file)
     (defmacro with-no-warnings (&rest body)
       `(progn ,@body))))
 
-(defcustom gnus-use-ido nil
-  "Whether to use `ido' for `completing-read'."
-  :version "24.1"
+(defcustom gnus-completing-read-function
+  #'gnus-std-completing-read
+  "Function to do a completing read."
   :group 'gnus-meta
-  :type 'boolean)
+  :type '(radio (function-item
+                 :doc "Use Emacs' standard `completing-read' function."
+                 gnus-std-completing-read)
+                (function-item :doc "Use iswitchb's completing-read function."
+                               gnus-icompleting-read)
+                (function-item :doc "Use ido's completing-read function."
+                               gnus-ido-completing-read)
+                (function)))
 
 (defcustom gnus-completion-styles
   (if (and (boundp 'completion-styles-alist)
@@ -1583,19 +1590,48 @@ SPEC is a predicate specifier that contains stuff like `or', `and',
        `(,(car spec) ,@(mapcar 'gnus-make-predicate-1 (cdr spec)))
       (error "Invalid predicate specifier: %s" spec)))))
 
+(defun gnus-std-completing-read (prompt collection &optional require-match
+                                        initial-input history def)
+  (completing-read prompt collection nil require-match
+                   initial-input history def))
+
+(defun gnus-icompleting-read (prompt collection &optional require-match
+                                     initial-input history def)
+  (let ((iswitchb-make-buflist-hook
+         (lambda ()
+           (setq iswitchb-temp-buflist
+                 (let ((choices (append (list)
+                                        (when initial-input (list initial-input))
+                                        history collection))
+                       filtered-choices)
+                   (while choices
+                     (when (and (car choices) (not (member (car choices) filtered-choices)))
+                       (setq filtered-choices (cons (car choices) filtered-choices)))
+                     (setq choices (cdr choices)))
+                   (nreverse filtered-choices))))))
+    (unwind-protect
+        (progn
+          (when (not iswitchb-mode)
+            (add-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup))
+          (iswitchb-read-buffer prompt def require-match))
+      (when (not iswitchb-mode)
+        (remove-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup)))))
+
+(defun gnus-ido-completing-read (prompt collection &optional require-match
+                                        initial-input history def)
+  (ido-completing-read prompt collection nil require-match
+                       initial-input history def))
+
 (defun gnus-completing-read (prompt collection &optional require-match
                                     initial-input history def)
-  "Call `completing-read' or `ido-completing-read'.
-Depends on `gnus-use-ido'."
+  "Do a completing read with the configured `gnus-completing-read-function'."
   (let ((completion-styles gnus-completion-styles))
     (funcall
-     (if gnus-use-ido
-         'ido-completing-read
-       'completing-read)
+     gnus-completing-read-function
      (concat prompt (when def
                       (concat " (default " def ")"))
              ": ")
-     collection nil require-match initial-input history def)))
+     collection require-match initial-input history def)))
 
 (defun gnus-graphic-display-p ()
   (if (featurep 'xemacs)