ad86ab8fb1
Adds the spacemacs|init-layer-company helper to set up company completion for a language layer and replaces existing simple company initializations. More complex initializations should use the new architecture directly and remain untouched by this commit.
102 lines
4.4 KiB
EmacsLisp
102 lines
4.4 KiB
EmacsLisp
;;; funcs.el --- Auto-completion functions File
|
|
;;
|
|
;; Copyright (c) 2012-2014 Sylvain Benner
|
|
;; Copyright (c) 2014-2015 Sylvain Benner & Contributors
|
|
;;
|
|
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
|
;; URL: https://github.com/syl20bnr/spacemacs
|
|
;;
|
|
;; This file is not part of GNU Emacs.
|
|
;;
|
|
;;; License: GPLv3
|
|
|
|
(spacemacs|add-toggle auto-completion
|
|
:status
|
|
(if (eq 'company auto-completion-front-end)
|
|
company-mode
|
|
auto-complete-mode)
|
|
:on
|
|
(progn
|
|
(if (eq 'company auto-completion-front-end)
|
|
(company-mode)
|
|
(auto-complete-mode))
|
|
(message "Enabled auto-completion (using %S)."
|
|
auto-completion-front-end))
|
|
:off
|
|
(progn
|
|
(if (eq 'company auto-completion-front-end)
|
|
(company-mode -1)
|
|
(auto-complete-mode -1))
|
|
(message "Disabled auto-completion."))
|
|
:documentation "Activate auto-completion."
|
|
:evil-leader "ta")
|
|
|
|
;; Company -------------------------------------------------------------------
|
|
|
|
(defmacro spacemacs|enable-company (mode &optional hook)
|
|
"Enable company for the given MODE.
|
|
MODE must match the symbol passed in `spacemacs|init-company-backends'.
|
|
By default the initialization function is hooked to `MODE-hook', it is
|
|
possible to explicitly define a hook with HOOK."
|
|
(let ((mode-hook (if hook hook
|
|
(intern (format "%S-hook" mode))))
|
|
(func (intern (format "spacemacs//init-company-%S" mode))))
|
|
`(when (configuration-layer/package-usedp 'company)
|
|
(defun ,func ()
|
|
,(format "Initialize company for %S" mode)
|
|
(set (make-variable-buffer-local 'auto-completion-front-end)
|
|
'company)
|
|
(set (make-variable-buffer-local 'company-backends)
|
|
,(intern (format "company-backends-%S" mode))))
|
|
(add-hook ',mode-hook ',func)
|
|
(add-hook ',mode-hook 'company-mode))))
|
|
|
|
(defun spacemacs/company-backend-with-yas (backend)
|
|
"Return BACKEND with support for yasnippet candidates."
|
|
backend
|
|
;; ------------------
|
|
;; syl20bnr: For now adding company-snippet to some backend like anaconda
|
|
;; has weird side effects, I need to investigate a little more on this
|
|
;; ------------------
|
|
;; (if (and (configuration-layer/package-usedp 'yasnippet)
|
|
;; auto-completion-enable-company-yasnippet
|
|
;; (not (eq 'company-semantic backend)))
|
|
;; (unless (and (listp backend) (member 'company-yasnippet backend))
|
|
;; (append (if (listp backend) backend (list backend))
|
|
;; (list :with 'company-yasnippet)))
|
|
;; ;; (cons backend '(company-yasnippet)))
|
|
;; backend)
|
|
)
|
|
|
|
;; Auto-complete -------------------------------------------------------------
|
|
|
|
(defmacro spacemacs|enable-auto-complete (mode &optional hook)
|
|
"Enable auto-complete for the given MODE.
|
|
By default the initialization function is hooked to `MODE-hook', it is
|
|
possible to explicitly define a hook with HOOK."
|
|
(let ((mode-hook (if hook hook
|
|
(intern (format "%S-hook" mode))))
|
|
(func (intern (format "spacemacs//init-auto-complete-%S" mode))))
|
|
`(when (configuration-layer/package-usedp 'auto-complete)
|
|
(defun ,func ()
|
|
,(format "Initialize auto-complete for %S" mode)
|
|
(set (make-variable-buffer-local 'auto-completion-front-end)
|
|
'auto-complete)
|
|
(set (make-variable-buffer-local 'company-backends)
|
|
,(intern (format "company-backends-%S" mode))))
|
|
(add-hook ',mode-hook ',func)
|
|
(add-hook ',mode-hook 'auto-complete-mode))))
|
|
|
|
(defmacro spacemacs|init-layer-company (layer mode)
|
|
"Helper to initialize the company-backends-MODE list and enable
|
|
company auto-completion for the mode. If you require more direct control
|
|
use spacemacs|init-company-backends and spacemacs|enable-company."
|
|
(let ((mode-hook (intern (format "%S-hook" mode)))
|
|
(pkg-list (intern (format "%S-packages" layer)))
|
|
(func (intern (format "%S/post-init-company" layer))))
|
|
`(progn
|
|
(spacemacs|init-company-backends ,mode)
|
|
(add-to-list ',pkg-list 'company)
|
|
(defun ,func ()
|
|
(spacemacs|enable-company ,mode)))))
|