2015-10-30 11:20:58 +00:00
#+TITLE : Auto-completion layer
2016-03-31 02:59:55 +00:00
2019-05-02 21:49:30 +00:00
#+TAGS : completion|layer
2019-05-07 20:05:06 +00:00
* Table of Contents :TOC_5_gh:noexport:
2017-05-22 14:16:12 +00:00
- [[#description ][Description ]]
2018-01-01 05:05:02 +00:00
- [[#features ][Features: ]]
2017-05-22 14:16:12 +00:00
- [[#install ][Install ]]
- [[#configuration ][Configuration ]]
- [[#key-bindings ][Key bindings ]]
- [[#snippets-directories ][Snippets directories ]]
- [[#show-snippets-in-auto-completion-popup ][Show snippets in auto-completion popup ]]
- [[#tooltips ][Tooltips ]]
- [[#sort-results-by-usage ][Sort results by usage ]]
2020-02-01 15:09:55 +00:00
- [[#disable-auto-completion-in-specific-layers ][Disable auto-completion in specific layers ]]
- [[#enable-company-globally ][Enable company globally ]]
2017-05-22 14:16:12 +00:00
- [[#replacing-company-by-auto-complete ][Replacing company by auto-complete ]]
- [[#add-auto-completion-in-a-layer ][Add auto-completion in a layer ]]
- [[#completion-back-ends ][Completion back ends ]]
- [[#improved-faces ][Improved faces ]]
2018-12-05 03:03:03 +00:00
- [[#key-bindings-1 ][Key bindings ]]
2017-05-22 14:16:12 +00:00
- [[#company ][Company ]]
- [[#auto-complete ][Auto-complete ]]
- [[#yasnippet ][Yasnippet ]]
- [[#auto-yasnippet ][Auto-yasnippet ]]
2015-06-10 16:44:30 +00:00
* Description
2018-08-12 18:15:59 +00:00
This layer adds auto-completion to all supported language layers.
2015-06-10 16:44:30 +00:00
2018-01-01 05:05:02 +00:00
** Features:
2018-08-12 18:15:59 +00:00
- Support for code completion with [[http://company-mode.github.io/ ][company ]] or [[https://github.com/auto-complete/auto-complete ][auto-complete ]] for various language layers
- Frequency-based suggestions via [[https://github.com/company-mode/company-statistics ][company-statistics ]] for =company=
- Integration with [[https://github.com/capitaomorte/yasnippet ][yasnippet ]] and [[https://github.com/abo-abo/auto-yasnippet ][auto-yasnippet ]]
- Automatic configuration of [[https://www.emacswiki.org/emacs/HippieExpand ][hippie-expand ]]
2019-10-04 17:02:00 +00:00
- Automatic docstring tooltips are provided by [[https://github.com/expez/company-quickhelp ][company-quickhelp ]]
2018-01-01 05:05:02 +00:00
2015-06-10 16:44:30 +00:00
* Install
2016-01-06 05:21:55 +00:00
To use this configuration layer, add it to your =~/.spacemacs= . You will need to
add =auto-completion= to the existing =dotspacemacs-configuration-layers= list in this
file.
2015-06-10 16:44:30 +00:00
2018-08-12 18:15:59 +00:00
As this is a support layer you will also have to install at least one supported language
layer for it to have any effect.
2015-06-10 16:44:30 +00:00
* Configuration
** Key bindings
You can customize the user experience of auto-completion with the following
layer variables:
2015-06-10 21:16:01 +00:00
1. =auto-completion-return-key-behavior= set the action to perform when the
2018-10-17 04:03:28 +00:00
~RET~ key is pressed, the possible values are:
- =complete= completes with the current selection
- =nil= does nothing
2015-06-10 21:16:01 +00:00
2. =auto-completion-tab-key-behavior= set the action to perform when the ~TAB~
2018-10-17 04:03:28 +00:00
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
2015-06-10 21:16:01 +00:00
3. =auto-completion-complete-with-key-sequence= is a string of two characters
2018-10-17 04:03:28 +00:00
denoting a key sequence that will perform a =complete action= if the sequence
has been entered quickly enough. If its value is =nil= then the feature is
disabled.
2016-01-08 20:29:58 +00:00
4. =auto-completion-complete-with-key-sequence-delay= is the number of seconds
2018-10-17 04:03:28 +00:00
to wait for the auto-completion key sequence to be entered. The default value
is 0.1 seconds.
2018-05-23 04:27:08 +00:00
5. =auto-completion-idle-delay= is the number of seconds to wait before suggesting
2018-10-23 14:18:21 +00:00
completions. The default value is 0.2 seconds. Set to =nil= to disable
2018-10-17 04:03:28 +00:00
automatic suggestions (the ~TAB~ key will still perform completion).
2020-05-15 20:07:17 +00:00
Set to 0.0 for optimal results with lsp mode.
6. =auto-completion-minimum-prefix-length= is the minimum number of characters
which must be entered before completions will be suggested automatically.
Set to 1 for optimal results with lsp mode.
2018-01-01 05:05:02 +00:00
2015-06-10 16:44:30 +00:00
The default configuration of the layer is:
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(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
auto-completion-complete-with-key-sequence-delay 0.1
2020-05-15 20:07:17 +00:00
auto-completion-minimum-prefix-length 2
2018-09-19 03:54:47 +00:00
auto-completion-idle-delay 0.2
auto-completion-private-snippets-directory nil
auto-completion-enable-snippets-in-popup nil
auto-completion-enable-help-tooltip nil
2019-10-13 02:11:10 +00:00
auto-completion-use-company-box nil
2018-09-19 03:54:47 +00:00
auto-completion-enable-sort-by-usage nil)))
2015-06-10 16:44:30 +00:00
#+END_SRC
2015-06-12 01:23:07 +00:00
~jk~ is a good candidate for =auto-completion-complete-with-key-sequence= if
2019-05-26 20:58:52 +00:00
you don't use it already.
2015-06-10 16:44:30 +00:00
2016-01-09 02:56:49 +00:00
** Snippets directories
The following directories are added by default:
2016-11-23 14:45:25 +00:00
- =~/.emacs.d/elpa/yasnippet-xxxxx/snippets=
- =~/.emacs.d/layers/auto-completion/snippets=
- =~/.emacs.d/private/snippets= (conditional to the value of =auto-completion-private-snippets-directory= )
- =~/.spacemacs.d/snippets= (conditional to the existence of =~/.spacemacs.d= directory)
2016-01-09 02:56:49 +00:00
2018-08-12 18:15:59 +00:00
You can provide additional directories by setting the variable =auto-completion-private-snippets-directory=
which can either take a single path as string or a list of paths.
2016-01-09 02:56:49 +00:00
If its value is =nil= then the path =~/.emacs.d/private/snippets= is used.
** Show snippets in auto-completion popup
By default, snippets are not shown in the auto-completion popup. To show them in
the popup, set the variable =auto-completion-enable-snippets-in-popup= to =t= .
#+BEGIN_SRC emacs-lisp
(setq-default dotspacemacs-configuration-layers
'((auto-completion :variables
2016-01-22 09:47:44 +00:00
auto-completion-enable-snippets-in-popup t)))
2016-01-09 02:56:49 +00:00
#+END_SRC
2015-06-10 16:44:30 +00:00
** Tooltips
2016-08-26 12:37:05 +00:00
To enable automatic docstring tooltips set =auto-completion-enable-help-tooltip=
to =t= .
2015-06-10 16:44:30 +00:00
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(setq-default dotspacemacs-configuration-layers
'((auto-completion :variables
auto-completion-enable-help-tooltip t)))
2015-06-10 16:44:30 +00:00
#+END_SRC
2016-08-26 12:37:05 +00:00
To enable manual non-automatic invocation of docstring tooltips, set it to
=manual= . The tooltip can be invoked manually by pressing ~M-h~ .
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(setq-default dotspacemacs-configuration-layers
'((auto-completion :variables
auto-completion-enable-help-tooltip 'manual)))
2016-08-26 12:37:05 +00:00
#+END_SRC
2019-10-13 02:11:10 +00:00
However the tooltip may overlap on text on macOS, you can use =company-box= on
Emacs 26+ by setting =auto-completion-use-company-box= to =t= .
2015-06-10 16:44:30 +00:00
** 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=
2018-08-12 18:15:59 +00:00
is used. The variable has no effect when =auto-complete= is used.
2015-06-10 16:44:30 +00:00
2021-03-21 20:54:06 +00:00
Beware: Sorting completion results is often done already by the
completion backend, doing it again in company may degrate
performance.
2015-06-10 16:44:30 +00:00
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(setq-default dotspacemacs-configuration-layers
'((auto-completion :variables
auto-completion-enable-sort-by-usage t)))
2015-06-10 16:44:30 +00:00
#+END_SRC
2020-02-01 15:09:55 +00:00
** Disable auto-completion in specific layers
See general documentation on how to [[https://github.com/syl20bnr/spacemacs/blob/develop/doc/DOCUMENTATION.org#disabling-layer-services-in-other-layers ][disable a layer for specific layers ]].
2020-01-26 00:00:06 +00:00
2020-02-01 15:09:55 +00:00
** Enable company globally
It can be done by adding =(global-company-mode)= in the
=dotspacemacs/user-config= function of your dotfile. But it is not recommended
to do so, you should instead open an issue to ask for auto-completion support
for the major-modes where it is missing.
2015-06-10 16:44:30 +00:00
2020-02-01 15:09:55 +00:00
If you choose to use =(global-company-mode)= then you loose some advantages
provided by the layer system like [[https://github.com/syl20bnr/spacemacs/blob/develop/doc/DOCUMENTATION.org#disabling-layer-services-in-other-layers ][disabling auto-completion for specific layers ]].
2015-06-10 16:44:30 +00:00
** 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
2017-01-02 05:39:04 +00:00
Here is an example to add =company= auto-completion to python buffers via the
package =company-anaconda= .
2015-06-10 16:44:30 +00:00
2017-01-02 05:39:04 +00:00
In the file =packages.el= of the python layer:
2015-06-10 16:44:30 +00:00
#+BEGIN_SRC emacs-lisp
;; Add the relevant packages to the layer
2017-01-02 05:39:04 +00:00
;; here it is `company-anaconda'
2015-06-10 16:44:30 +00:00
(setq python-packages
'(...
2017-07-02 13:48:06 +00:00
(company-anaconda :toggle (configuration-layer/package-used-p 'company))
2015-06-10 16:44:30 +00:00
...))
2016-05-30 02:39:21 +00:00
(defun python/init-company-anaconda ()
(use-package company-anaconda
2018-03-04 04:37:53 +00:00
:defer t
2017-01-02 05:39:04 +00:00
:init
(spacemacs|add-company-backends
2017-01-05 06:59:27 +00:00
:backends company-anaconda
2017-01-02 05:39:04 +00:00
:modes python-mode)))
2015-06-10 16:44:30 +00:00
#+END_SRC
2016-06-22 15:12:20 +00:00
** Completion back ends
Many spacemacs layers (e.g., python, html, haskell) configure company mode
backends to provide mode-specific completion. These modes will include
2018-08-12 18:15:59 +00:00
completion backends specified in the =spacemacs-default-company-backends=
2016-06-22 15:12:20 +00:00
variable. The defaults should work well, but you can configure this variable in
2016-11-22 20:53:50 +00:00
your =.spacemacs= file with (e.g.)
2018-07-10 10:57:25 +00:00
2016-06-22 15:12:20 +00:00
#+BEGIN_SRC emacs-lisp
(setq-default
dotspacemacs-configuration-layers
'((auto-completion :variables
spacemacs-default-company-backends '(company-files company-capf))))
#+END_SRC
2016-11-21 23:32:00 +00:00
2016-05-23 11:11:32 +00:00
** Improved faces
For nicer-looking faces, try adding the following to `custom-set-faces` in your dotspacemacs file.
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(custom-set-faces
'(company-tooltip-common
((t (:inherit company-tooltip :weight bold :underline nil))))
'(company-tooltip-common-selection
((t (:inherit company-tooltip-selection :weight bold :underline nil)))))
2016-05-23 11:11:32 +00:00
#+END_SRC
2016-06-10 04:09:42 +00:00
2018-12-05 03:03:03 +00:00
* Key bindings
2015-06-10 16:44:30 +00:00
** Company
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2016-08-26 12:37:05 +00:00
|-------------+------------------------------------------------------------------------------------------------------|
| ~C-d~ | open minibuffer with documentation of thing at point in company dropdown |
2018-06-05 22:20:16 +00:00
| ~C-/~ | show candidates in Helm or Ivy (for fuzzy searching) |
2016-08-26 12:37:05 +00:00
| ~C-M-/~ | filter the company dropdown menu |
2019-05-26 20:58:52 +00:00
| ~M-h~ | show current candidate's documentation in a tooltip (requires =auto-completion-enable-help-tooltip=) |
2016-04-22 01:29:20 +00:00
Vim Style:
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2016-04-22 02:25:51 +00:00
|-------------+----------------------------------------------|
| ~C-j~ | (vim style) go down in company dropdown menu |
| ~C-k~ | (vim style) go up in company dropdown menu |
| ~C-l~ | (vim style) complete selection |
2016-04-22 01:29:20 +00:00
Emacs style:
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2016-04-22 02:25:51 +00:00
|-------------+------------------------------------------------|
| ~C-n~ | (emacs style) go down in company dropdown menu |
| ~C-p~ | (emacs style) go up in company dropdown menu |
2015-06-10 16:44:30 +00:00
** Auto-complete
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2015-06-10 16:44:30 +00:00
|-------------+----------------------------------------------------------------------|
| ~C-j~ | select next candidate |
| ~C-k~ | select previous candidate |
| ~TAB~ | expand selection or select next candidate |
| ~S-TAB~ | select previous candidate |
2016-11-24 20:38:44 +00:00
| ~RET~ | complete word, if word is already completed insert a carriage return |
2015-06-10 16:44:30 +00:00
** Yasnippet
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2015-06-10 16:44:30 +00:00
|-------------+----------------------------------------------------------------|
| ~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
2018-12-05 03:03:03 +00:00
| Key binding | Description |
2015-06-10 16:44:30 +00:00
|-------------+---------------------------------------------------------------------------|
| ~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 |