#+TITLE: Auto-Completion configuration layer for Spacemacs * Table of Contents :TOC@4: - [[#description][Description]] - [[#install][Install]] - [[#configuration][Configuration]] - [[#key-bindings][Key bindings]] - [[#tooltips][Tooltips]] - [[#sort-results-by-usage][Sort results by usage]] - [[#enable-company-or-auto-complete-globally][Enable company or auto-complete globally]] - [[#replacing-company-by-auto-complete][Replacing company by auto-complete]] - [[#add-auto-completion-in-a-layer][Add auto-completion in a layer]] - [[#key-bindings][Key Bindings]] - [[#company][Company]] - [[#auto-complete][Auto-complete]] - [[#yasnippet][Yasnippet]] - [[#auto-yasnippet][Auto-yasnippet]] * Description This layer provides auto-completion to Spacemacs. The following completion engines are supported: - [[http://company-mode.github.io/][company]] - [[http://auto-complete.org/][auto-complete]] Snippets are supported via [[https://github.com/capitaomorte/yasnippet][yasnippet]] and [[https://github.com/abo-abo/auto-yasnippet][auto-yasnippet]]. This layer also configures =hippie-expand=. * Install To use this configuration layer add it to your =~/.spacemacs= #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '(auto-completion)) #+END_SRC * Configuration ** Key bindings You can customize the user experience of auto-completion with the following layer variables: =auto-completion-return-key-behavior= set the action to perform when the ~RET~ key is pressed, the possible values are: - =complete= completes with the current selection - =nil= does nothing =auto-completion-tab-key-behavior= set the action to perform when the ~TAB~ key is pressed, the possible values are: - =complete= completes with the current selection - =cycle= completes the common prefix and cycle between candidates - =nil= does nothing =auto-completion-complete-with-key-sequence= is a string of two characters denoting a key sequence that will perform a =complete= action if the sequence as been entered quickly enough. If its value is =nil= then the feature is disabled. The default configuration of the layer is: #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '( (auto-completion :variables auto-completion-return-key-behavior 'complete auto-completion-tab-key-behavior 'cycle auto-completion-complete-with-key-sequence nil) )) #+END_SRC =jk= is a good candidate for =auto-completion-complete-with-key-sequence= if you don't use it already. ** Tooltips To enable docstring tooltips set =auto-completion-enable-help-tooltip= to =t= #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '(auto-completion :variables auto-completion-enable-help-tooltip t)) #+END_SRC ** Sort results by usage To enable sorting auto-completion results by their usage frequency set =auto-completion-enable-sort-by-usage= to =t=. This feature is provided by the [[https://github.com/company-mode/company-statistics][company-statistics]] package when =company= is used. The variable has no effect when =auto-complete= is used. #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '(auto-completion :variables auto-completion-enable-sort-by-usage t)) #+END_SRC ** Enable company or auto-complete globally By default Spacemacs enables auto-completion explicitly for each supported major-mode, it means that =company= and =auto-complete= are not enabled globally, it allows more flexibility to choose an auto-completion engine for a given mode. You may want to enable company globally to get auto-completion everywhere even in the modes which are not configured by Spacemacs. To do so, you just have to add =(global-company-mode)= in the =dotspacemacs/config= function of your dotfile. Note that if you want to enable =auto-complete= globally you will have to disable =company= first, see the next section to do so. ** Replacing company by auto-complete You can disable =company= by adding it to the =dotspacemacs-excluded-packages= variable, then you are free to enable =auto-complete= globally. ** Add auto-completion in a layer Here is an example to add =company= auto-completion to python buffer: In =config.el=: #+BEGIN_SRC emacs-lisp ;; Define the buffer local company backend variable (spacemacs|defvar-company-backends python-mode) #+END_SRC In =packages.el=: #+BEGIN_SRC emacs-lisp ;; Add the relevant packages to the layer (setq python-packages '(... company company-anaconda ...)) ;; Configure the packages (when (configuration-layer/layer-usedp 'auto-completion) ;; Hook company to python-mode (defun python/post-init-company () (spacemacs|add-company-hook python-mode)) ;; Add the backend to the major-mode specific backend list (defun python/init-company-anaconda () (use-package company-anaconda :if (configuration-layer/package-usedp 'company) :defer t :init (push 'company-anaconda company-backends-python-mode)))) #+END_SRC * Key Bindings ** Company | Key Binding | Description | |-------------+--------------------------------------------------------------------------| | ~C-j~ | go down in company dropdown menu | | ~C-k~ | go up in company dropdown menu | | ~C-/~ | search in company dropdown | | ~C-M-/~ | filter the company dropdown menu | | ~C-d~ | open minibuffer with documentation of thing at point in company dropdown | ** Auto-complete | Key Binding | Description | |-------------+----------------------------------------------------------------------| | ~C-j~ | select next candidate | | ~C-k~ | select previous candidate | | ~TAB~ | expand selection or select next candidate | | ~S-TAB~ | select previous candidate | | ~return~ | complete word, if word is already completed insert a carriage return | ** Yasnippet | Key Binding | Description | |-------------+----------------------------------------------------------------| | ~M-/~ | Expand a snippet if text before point is a prefix of a snippet | | ~SPC i s~ | List all current yasnippets for inserting | ** Auto-yasnippet | Key Binding | Description | |-------------+---------------------------------------------------------------------------| | ~SPC i S c~ | create a snippet from an active region | | ~SPC i S e~ | Expand the snippet just created with ~SPC i y~ | | ~SPC i S w~ | Write the snippet inside =private/snippets= directory for future sessions |