branch: master
commit 373c0789070017446c8b0b1dc115c154bfbdac53
Author: João Távora <[email protected]>
Commit: Dmitry Gutov <[email protected]>
company-capf: Use exit-function that came with the completion table in use
Before, capf-data was fetched again after the completion is inserted,
which caused problems when exit-function is a closure that references
some data dependent on the current buffer contents.
* company-capf.el (company-capf--current-completion-data): New variable.
(company-capf): Set it in `candidates'.
(company--capf-post-completion): Use it.
Closes #845.
---
company-capf.el | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/company-capf.el b/company-capf.el
index faac44c..9b353a7 100644
--- a/company-capf.el
+++ b/company-capf.el
@@ -34,6 +34,9 @@
(defvar company--capf-cache nil)
+(defvar company-capf--current-completion-data nil
+ "Value last returned by `company-capf' when called with `candidates'.")
+
(defun company--capf-data ()
(let ((cache company--capf-cache))
(if (and (equal (current-buffer) (car cache))
@@ -84,6 +87,7 @@
(t prefix))))))
(`candidates
(let ((res (company--capf-data)))
+ (setq company-capf--current-completion-data res)
(when res
(let* ((table (nth 3 res))
(pred (plist-get (nthcdr 4 res) :predicate))
@@ -157,7 +161,11 @@
))
(defun company--capf-post-completion (arg)
- (let* ((res (company--capf-data))
+ ;; FIXME: Note the access to `company-capf--current-completion-data' and not
+ ;; `company--capf-data'. It should happen to contain just the data we need,
+ ;; which includes the `:exit-function' that we got when we received the
+ ;; original completion table, not the one we get when we re-call capf.
+ (let* ((res company-capf--current-completion-data)
(exit-function (plist-get (nthcdr 4 res) :exit-function))
(table (nth 3 res))
(pred (plist-get (nthcdr 4 res) :predicate)))