Append default backends to buffer-local backends

This commit is contained in:
Henrik Lissner 2018-07-30 12:54:59 +02:00
parent e94f1f39f4
commit 533cb13a02
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
3 changed files with 28 additions and 18 deletions

View file

@ -55,12 +55,14 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to
;; ;;
(defun +company--backends () (defun +company--backends ()
(or (cl-loop for (mode . rest) in +company-backend-alist (append (cl-loop for (mode . rest) in +company-backend-alist
for type = (car rest) for type = (car rest)
for backends = (cdr rest) for backends = (cdr rest)
if (or (and (eq type :derived) (derived-mode-p mode)) ; parent modes if (or (and (eq type :derived) (derived-mode-p mode)) ; parent modes
(and (eq type :exact) (eq major-mode mode)) ; major modes (and (eq type :exact)
(and (boundp mode) (symbol-value mode))) ; minor modes (or (eq major-mode mode) ; major modes
(and (boundp mode)
(symbol-value mode))))) ; minor modes
nconc backends) nconc backends)
(default-value 'company-backends))) (default-value 'company-backends)))

View file

@ -12,6 +12,7 @@
company-require-match 'never company-require-match 'never
company-global-modes company-global-modes
'(not comint-mode erc-mode message-mode help-mode gud-mode eshell-mode) '(not comint-mode erc-mode message-mode help-mode gud-mode eshell-mode)
company-backends '(company-dabbrev)
company-frontends company-frontends
'(company-pseudo-tooltip-frontend '(company-pseudo-tooltip-frontend
company-echo-metadata-frontend) company-echo-metadata-frontend)

View file

@ -23,26 +23,33 @@
;; ;;
(it "sets backends for a major mode" (it "sets backends for a major mode"
(set-company-backend! 'text-mode 'a) (set-company-backend! 'text-mode 'a)
(expect (backends 'text-mode) :to-equal '(a))) (expect (backends 'text-mode) :to-equal '(a t)))
(it "sets backends for a derived-mode" (it "sets backends for a derived-mode"
(set-company-backend! :derived 'prog-mode 'a) (set-company-backend! :derived 'prog-mode 'a)
(expect (backends 'prog-mode) :to-equal '(a)) (expect (backends 'prog-mode) :to-equal '(a t))
(expect (backends 'emacs-lisp-mode) :to-equal '(a))) (expect (backends 'emacs-lisp-mode) :to-equal '(a t)))
(it "sets multiple backends for exact major modes" (it "sets multiple backends for exact major modes"
(set-company-backend! '(text-mode emacs-lisp-mode) 'a 'b) (set-company-backend! '(text-mode emacs-lisp-mode) 'a 'b)
(expect (backends 'text-mode) :to-equal (backends 'emacs-lisp-mode))) (expect (backends 'text-mode) :to-equal (backends 'emacs-lisp-mode)))
(it "sets cumulative backends" (it "sets cumulative backends"
(set-company-backend! :derived 'prog-mode 'a) (set-company-backend! :derived 'prog-mode '(a b c))
(set-company-backend! 'emacs-lisp-mode 'b) (set-company-backend! 'emacs-lisp-mode 'd 'e)
(expect (backends 'emacs-lisp-mode) :to-equal '(b a))) (expect (backends 'emacs-lisp-mode) :to-equal '(d e (a b c) t)))
(it "sets cumulative backends with a minor mode"
(set-company-backend! :derived 'prog-mode '(a b c))
(set-company-backend! 'emacs-lisp-mode 'd 'e)
(set-company-backend! 'some-minor-mode 'x 'y)
(setq-local some-minor-mode t)
(expect (backends 'emacs-lisp-mode) :to-equal '(x y d e (a b c) t)))
(it "overwrites past backends" (it "overwrites past backends"
(set-company-backend! 'text-mode 'old 'backends) (set-company-backend! 'text-mode 'old 'backends)
(set-company-backend! 'text-mode 'new 'backends) (set-company-backend! 'text-mode 'new 'backends)
(expect (backends 'text-mode) :to-equal '(new backends))) (expect (backends 'text-mode) :to-equal '(new backends t)))
(it "unsets past backends" (it "unsets past backends"
(set-company-backend! 'text-mode 'old) (set-company-backend! 'text-mode 'old)
@ -53,16 +60,16 @@
(set-company-backend! :derived 'prog-mode 'old) (set-company-backend! :derived 'prog-mode 'old)
(set-company-backend! 'emacs-lisp-mode 'child) (set-company-backend! 'emacs-lisp-mode 'child)
(set-company-backend! :derived 'prog-mode nil) (set-company-backend! :derived 'prog-mode nil)
(expect (backends 'emacs-lisp-mode) :to-equal '(child))) (expect (backends 'emacs-lisp-mode) :to-equal '(child t)))
(it "overwrites past cumulative backends" (it "overwrites past cumulative backends"
(set-company-backend! :derived 'prog-mode 'base) (set-company-backend! :derived 'prog-mode 'base)
(set-company-backend! 'emacs-lisp-mode 'old) (set-company-backend! 'emacs-lisp-mode 'old)
(set-company-backend! 'emacs-lisp-mode 'new) (set-company-backend! 'emacs-lisp-mode 'new)
(expect (backends 'emacs-lisp-mode) :to-equal '(new base))) (expect (backends 'emacs-lisp-mode) :to-equal '(new base t)))
(it "overwrites past parent backends" (it "overwrites past parent backends"
(set-company-backend! :derived 'prog-mode 'base) (set-company-backend! :derived 'prog-mode 'base)
(set-company-backend! 'emacs-lisp-mode 'child) (set-company-backend! 'emacs-lisp-mode 'child)
(set-company-backend! :derived 'prog-mode 'new) (set-company-backend! :derived 'prog-mode 'new)
(expect (backends 'emacs-lisp-mode) :to-equal '(child new))))) (expect (backends 'emacs-lisp-mode) :to-equal '(child new t)))))