branch: master commit 373c0789070017446c8b0b1dc115c154bfbdac53 Author: João Távora <joaotav...@gmail.com> Commit: Dmitry Gutov <dgu...@yandex.ru>
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)))