]> code.delx.au - gnu-emacs-elpa/commitdiff
Keep selection when updating completions.
authorNikolaj Schumacher <git@nschum.de>
Mon, 16 Mar 2009 19:36:56 +0000 (20:36 +0100)
committerNikolaj Schumacher <git@nschum.de>
Fri, 20 Mar 2009 11:58:29 +0000 (12:58 +0100)
company.el

index ce55081a16c8944579156fc57f6cb6f71a391303..8f17ef99b953344e9b2c3a50729ebc15cdb890ca 100644 (file)
         (push c new)))
     (nreverse new)))
 
-(defsubst company-calculate-candidates (prefix)
-  (or (setq company-candidates (cdr (assoc prefix company-candidates-cache)))
-      (let ((len (length prefix))
-            (completion-ignore-case (funcall company-backend 'ignore-case))
-            prev)
-        (dotimes (i len)
-          (when (setq prev (cdr (assoc (substring prefix 0 (- len i))
-                                       company-candidates-cache)))
-            (setq company-candidates (all-completions prefix prev))
-            (return t))))
-      (progn
-        (setq company-candidates (funcall company-backend 'candidates prefix))
-        (when company-candidates-predicate
-          (setq company-candidates
-                (company-apply-predicate company-candidates
-                                         company-candidates-predicate)))
-        (unless (funcall company-backend 'sorted)
-          (setq company-candidates (sort company-candidates 'string<)))))
-  (unless (assoc prefix company-candidates-cache)
-    (push (cons prefix company-candidates) company-candidates-cache))
-  (setq company-selection 0
-        company-prefix prefix)
+(defun company-update-candidates (candidates)
+  (if (> company-selection 0)
+      ;; Try to restore the selection
+      (let ((selected (nth company-selection company-candidates)))
+        (setq company-selection 0
+              company-candidates candidates)
+        (when selected
+          (while (and candidates (string< (pop candidates) selected))
+            (incf company-selection))
+          (unless candidates
+            ;; Make sure selection isn't out of bounds.
+            (setq company-selection (min (1- (length company-candidates))
+                                         company-selection)))))
+    (setq company-selection 0
+          company-candidates candidates))
+  ;; Calculate common.
   (let ((completion-ignore-case (funcall company-backend 'ignore-case)))
     (setq company-common (try-completion company-prefix company-candidates)))
   (when (eq company-common t)
-    (setq company-candidates nil))
+    (setq company-candidates nil)))
+
+(defsubst company-calculate-candidates (prefix)
+  (setq company-prefix prefix)
+  (company-update-candidates
+   (or (cdr (assoc prefix company-candidates-cache))
+       (let ((len (length prefix))
+             (completion-ignore-case (funcall company-backend 'ignore-case))
+             prev)
+         (dotimes (i len)
+           (when (setq prev (cdr (assoc (substring prefix 0 (- len i))
+                                        company-candidates-cache)))
+             (return (all-completions prefix prev)))))
+       (let ((candidates (funcall company-backend 'candidates prefix)))
+         (and company-candidates-predicate
+              (setq candidates
+                    (company-apply-predicate candidates
+                                             company-candidates-predicate)))
+         (unless (funcall company-backend 'sorted)
+           (setq candidates (sort candidates 'string<)))
+         candidates)))
+  (unless (assoc prefix company-candidates-cache)
+    (push (cons prefix company-candidates) company-candidates-cache))
   company-candidates)
 
 (defun company-idle-begin ()