From aa4c9744f85ab79c2b970341a4a2c9dd9c624d9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 19:41:49 +0200 Subject: [PATCH] Fix set-company-backends! & update docstring + It wasn't preserving insertion order of multiple backends + It failed when BACKENDS = nil (supposed to unset mode backends) + Use eq/equal as a test-fn conditionally (glorious, glorious premature optimization) --- modules/completion/company/autoload.el | 32 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 04133b1c1..f1d59abed 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -2,20 +2,34 @@ ;;;###autodef (defun set-company-backend! (modes &rest backends) - "Prepends BACKENDS to `company-backends' in major MODES. + "Prepends BACKENDS (in order) to `company-backends' in MODES. -MODES should be one major-mode symbol or a list of them." +MODES should be one symbol or a list of them, representing major or minor modes. +This will overwrite backends for MODES on consecutive uses. + +If BACKENDS is just 'nil, unset the backends for MODES. + +Examples: + + (set-company-backend! 'js2-mode 'company-tide 'company-yasnippet) + (set-company-backend! 'sh-mode + '(company-shell :with company-yasnippet)) + (set-company-backend! 'js2-mode + '(:separate company-irony-c-headers company-irony)) + (set-company-backend! 'sh-mode nil)" (dolist (mode (doom-enlist modes)) (let ((fn (intern (format "+company|init-%s" mode))) (hook (intern (format "%s-hook" mode)))) - (cond (backends + (cond ((and backends (not (eq (car backends) 'nil))) (fset fn - (lambda () (when (or (eq major-mode mode) - (and (boundp mode) (symbol-value mode))) - (require 'company) - (make-local-variable 'company-backends) - (dolist (backend backends) - (cl-pushnew backend company-backends :test #'equal))))) + (lambda () + (when (or (eq major-mode mode) + (and (boundp mode) (symbol-value mode))) + (require 'company) + (make-local-variable 'company-backends) + (dolist (backend (reverse backends)) + (cl-pushnew backend company-backends + :test (if (symbolp backend) #'eq #'equal)))))) (add-hook hook fn)) (t (fmakunbound fn)