]> code.delx.au - gnu-emacs-elpa/blobdiff - company-capf.el
Allow scrolling the doc window with the mouse wheel
[gnu-emacs-elpa] / company-capf.el
index e27ae7a4609c5854200fd259ae596c815551b3eb..4962a26c0d8a4e1ac6512ba0c8f3247b48f7b54c 100644 (file)
 (require 'company)
 (require 'cl-lib)
 
+(defvar company--capf-cache nil)
+
 (defun company--capf-data ()
+  (let ((cache company--capf-cache))
+    (if (and (equal (current-buffer) (car cache))
+             (equal (point) (car (setq cache (cdr cache))))
+             (equal (buffer-chars-modified-tick) (car (setq cache (cdr cache)))))
+        (cadr cache)
+      (let ((data (company--capf-data-real)))
+        (setq company--capf-cache
+              (list (current-buffer) (point) (buffer-chars-modified-tick) data))
+        data))))
+
+(defun company--capf-data-real ()
   (cl-letf* (((default-value 'completion-at-point-functions)
               ;; Ignore tags-completion-at-point-function because it subverts
               ;; company-etags in the default value of company-backends, where
     (`init nil)      ;Don't bother: plenty of other ways to initialize the code.
     (`post-completion
      (let* ((res (company--capf-data))
-            (exit-function (plist-get (nthcdr 4 res) :exit-function)))
+            (exit-function (plist-get (nthcdr 4 res) :exit-function))
+            (table (nth 3 res))
+            (pred (plist-get (nthcdr 4 res) :predicate)))
        (if exit-function
-           (funcall exit-function arg 'finished))))
+           ;; Follow the example of `completion--done'.
+           (funcall exit-function arg
+                    (if (eq (try-completion arg table pred) t)
+                        'finished 'sole)))))
     ))
 
 (provide 'company-capf)