emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/icomplete.el,v


From: Stefan Monnier
Subject: [Emacs-diffs] Changes to emacs/lisp/icomplete.el,v
Date: Thu, 22 May 2008 03:15:34 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Stefan Monnier <monnier>        08/05/22 03:15:32

Index: icomplete.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/icomplete.el,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- icomplete.el        20 May 2008 13:44:50 -0000      1.53
+++ icomplete.el        22 May 2008 03:15:32 -0000      1.54
@@ -117,9 +117,9 @@
 
 ;;;_ + Internal Variables
 ;;;_  = icomplete-eoinput nil
-(defvar icomplete-eoinput nil
-  "Point where minibuffer input ends and completion info begins.")
-(make-variable-buffer-local 'icomplete-eoinput)
+(defvar icomplete-overlay (make-overlay (point-min) (point-min) nil t t)
+  "Overlay used to display the list of completions.")
+
 ;;;_  = icomplete-pre-command-hook
 (defvar icomplete-pre-command-hook nil
   "Incremental-minibuffer-completion pre-command-hook.
@@ -215,15 +215,7 @@
   "Remove completions display \(if any) prior to new user input.
 Should be run in on the minibuffer `pre-command-hook'.  See `icomplete-mode'
 and `minibuffer-setup-hook'."
-  (when (and icomplete-mode icomplete-eoinput)
-
-    (unless (>= icomplete-eoinput (point-max))
-      (let ((buffer-undo-list t) ; prevent entry
-           deactivate-mark)
-       (delete-region icomplete-eoinput (point-max))))
-
-    ;; Reestablish the safe value.
-    (setq icomplete-eoinput nil)))
+  (delete-overlay icomplete-overlay))
 
 ;;;_ > icomplete-exhibit ()
 (defun icomplete-exhibit ()
@@ -233,9 +225,6 @@
   (when (and icomplete-mode (icomplete-simple-completing-p))
     (save-excursion
       (goto-char (point-max))
-      ;; Register the end of input, so we know where the extra stuff
-      ;; (match-status info) begins:
-      (setq icomplete-eoinput (point))
                                         ; Insert the match-status information:
       (if (and (> (point-max) (minibuffer-prompt-end))
               buffer-undo-list         ; Wait for some user input.
@@ -250,16 +239,21 @@
                ;; embarking on computing completions:
                (sit-for icomplete-compute-delay)))
          (let ((text (while-no-input
-                       (list
                         (icomplete-completions
                          (field-string)
                          minibuffer-completion-table
                          minibuffer-completion-predicate
-                         (not minibuffer-completion-confirm)))))
+                         (not minibuffer-completion-confirm))))
                (buffer-undo-list t)
                deactivate-mark)
            ;; Do nothing if while-no-input was aborted.
-           (if (consp text) (insert (car text))))))))
+           (when (stringp text)
+              (move-overlay icomplete-overlay (point) (point) (current-buffer))
+              ;; The current C cursor code doesn't know to use the overlay's
+              ;; marker's stickiness to figure out whether to place the cursor
+              ;; before or after the string, so let's spoon-feed it the pos.
+              (put-text-property 0 1 'cursor t text)
+              (overlay-put icomplete-overlay 'after-string text)))))))
 
 ;;;_ > icomplete-completions (name candidates predicate require-match)
 (defun icomplete-completions (name candidates predicate require-match)
@@ -281,16 +275,16 @@
 matches exist.  \(Keybindings for uniquely matched commands
 are exhibited within the square braces.)"
 
-  (let* ((comps (completion-all-completions name candidates predicate
-                                            (length name)))
-         (last (last comps))
-         (base-size (if (consp last) (prog1 (cdr last) (setcdr last nil))))
+  (let* ((comps (completion-all-sorted-completions))
+         (last (if (consp comps) (last comps)))
+         (base-size (cdr last))
          (open-bracket (if require-match "(" "["))
          (close-bracket (if require-match ")" "]")))
     ;; `concat'/`mapconcat' is the slow part.  With the introduction of
     ;; `icomplete-prospects-length', there is no need for `catch'/`throw'.
-    (if (null comps)
+    (if (not (consp comps))
         (format " %sNo matches%s" open-bracket close-bracket)
+      (if last (setcdr last nil))
       (let* ((most-try
               (if (and base-size (> base-size 0))
                   (completion-try-completion
@@ -299,7 +293,8 @@
                 ;; the same with `comps'.
                 (completion-try-completion
                  name comps nil (length name))))
-            (most (if (consp most-try) (car most-try) (car comps)))
+            (most (if (consp most-try) (car most-try)
+                     (if most-try (car comps) "")))
              ;; Compare name and most, so we can determine if name is
              ;; a prefix of most, or something else.
             (compare (compare-strings name nil nil
@@ -320,7 +315,7 @@
              (prefix-len
               ;; Find the common prefix among `comps'.
              (if (eq t (compare-strings (car comps) nil (length most)
-                                        most nil nil case-fold-search))
+                                        most nil nil completion-ignore-case))
                   ;; Common case.
                  (length most)
                 ;; Else, use try-completion.
@@ -329,7 +324,7 @@
                        (length comps-prefix)))))
 
             prospects most-is-exact comp limit)
-       (if (or (eq most-try t) (null (cdr comps)))
+       (if (eq most-try t) ;; (or (null (cdr comps))
            (setq prospects nil)
          (while (and comps (not limit))
            (setq comp
@@ -339,16 +334,17 @@
                  ((member comp prospects))
                  (t (setq prospects-len (+ (length comp) 1 prospects-len))
                     (if (< prospects-len icomplete-prospects-length)
-                        (setq prospects (cons comp prospects))
+                        (push comp prospects)
                       (setq limit t))))))
+        ;; Restore the base-size info, since completion-all-sorted-completions
+        ;; is cached.
+        (if last (setcdr last base-size))
        (if prospects
            (concat determ
                    "{"
                    (and most-is-exact ",")
-                   (mapconcat 'identity
-                              (sort prospects (function string-lessp))
-                              ",")
-                   (and comps ",...")
+                   (mapconcat 'identity (nreverse prospects) ",")
+                   (and limit ",...")
                    "}")
          (concat determ
                  " [Matched"




reply via email to

[Prev in Thread] Current Thread [Next in Thread]