]> git.eshelyaron.com Git - emacs.git/commitdiff
2004-04-17 John Wiegley <johnw@newartisans.com>
authorJohn Wiegley <johnw@newartisans.com>
Sat, 17 Apr 2004 22:04:04 +0000 (22:04 +0000)
committerJohn Wiegley <johnw@newartisans.com>
Sat, 17 Apr 2004 22:04:04 +0000 (22:04 +0000)
* iswitchb.el (iswitchb-max-to-show): Added a new config variable
which optionally limits the number of names shown in the
minibuffer.  Off by default.
(iswitchb-completions): Use `iswitchb-max-to-show'.  This speeds
up iswitchb for users with a multitude of open buffers, by showing
only the first and last N/2 buffers in the completion list (which
is enough for C-s/C-r, and to know that more characters need to be
typed to refine the completion list).

lisp/iswitchb.el

index aab768387d023e9afada5e3cd919eb939830b8bf..0c43c27075116c75c1f09cacf15574b7d735bec9 100644 (file)
@@ -298,6 +298,13 @@ example functions that filter buffernames."
   :type '(repeat (choice regexp function))
   :group 'iswitchb)
 
+(defcustom iswitchb-max-to-show nil
+  "*If non-nil, limit the number of names shown in the minibuffer.
+This can greatly speed up iswitchb if you have a multitude of
+buffers open."
+  :type 'integer
+  :group 'iswitchb)
+
 (defcustom iswitchb-cannot-complete-hook 'iswitchb-completion-help
   "*Hook run when `iswitchb-complete' can't complete any more.
 The most useful values are `iswitchb-completion-help', which pops up a
@@ -1185,6 +1192,15 @@ Copied from `icomplete-exhibit' with two changes:
                   contents
                   (not minibuffer-completion-confirm)))))))
 
+(defun iswitchb-output-completion (com)
+  (if (= (length com) most-len)
+      ;; Most is one exact match,
+      ;; note that and leave out
+      ;; for later indication:
+      (ignore
+       (setq most-is-exact t))
+    (substring com most-len)))
+
 (defun iswitchb-completions (name require-match)
   "Return the string that is displayed after the user's text.
 Modified from `icomplete-completions'."
@@ -1224,28 +1240,23 @@ Modified from `icomplete-completions'."
                     "")
                   (if (not iswitchb-use-fonts) " [Matched]")))
          (t                            ;multiple matches
+          (if (and iswitchb-max-to-show
+                   (> (length comps) iswitchb-max-to-show))
+              (setq comps
+                    (append
+                     (subseq comps 0 (/ iswitchb-max-to-show 2))
+                     (list "...")
+                     (subseq comps (- (length comps)
+                                      (/ iswitchb-max-to-show 2))))))
           (let* (
                  ;;(most (try-completion name candidates predicate))
                  (most nil)
                  (most-len (length most))
                  most-is-exact
-                 (alternatives
-                  (apply
-                   (function concat)
-                   (cdr (apply
-                         (function nconc)
-                         (mapcar '(lambda (com)
-                                    (if (= (length com) most-len)
-                                        ;; Most is one exact match,
-                                        ;; note that and leave out
-                                        ;; for later indication:
-                                        (progn
-                                          (setq most-is-exact t)
-                                          ())
-                                      (list ","
-                                            (substring com
-                                                       most-len))))
-                                 comps))))))
+                 (alternatives (if most
+                                   (mapconcat 'iswitchb-output-completion
+                                              comps ",")
+                                 (mapconcat 'identity comps ","))))
 
             (concat