254 lines
11 KiB
Org Mode
254 lines
11 KiB
Org Mode
#+TITLE: Auto-completion layer
|
||
|
||
#+TAGS: completion|layer
|
||
|
||
* Table of Contents :TOC_4_gh:noexport:
|
||
- [[#description][Description]]
|
||
- [[#features][Features:]]
|
||
- [[#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]]
|
||
- [[#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]]
|
||
- [[#completion-back-ends][Completion back ends]]
|
||
- [[#improved-faces][Improved faces]]
|
||
- [[#key-bindings-1][Key bindings]]
|
||
- [[#company][Company]]
|
||
- [[#auto-complete][Auto-complete]]
|
||
- [[#yasnippet][Yasnippet]]
|
||
- [[#auto-yasnippet][Auto-yasnippet]]
|
||
|
||
* Description
|
||
This layer adds auto-completion to all supported language layers.
|
||
|
||
** Features:
|
||
- 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]]
|
||
|
||
* Install
|
||
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.
|
||
|
||
As this is a support layer you will also have to install at least one supported language
|
||
layer for it to have any effect.
|
||
|
||
* Configuration
|
||
** Key bindings
|
||
You can customize the user experience of auto-completion with the following
|
||
layer variables:
|
||
1. =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
|
||
2. =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
|
||
3. =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
|
||
has been entered quickly enough. If its value is =nil= then the feature is
|
||
disabled.
|
||
4. =auto-completion-complete-with-key-sequence-delay= is the number of seconds
|
||
to wait for the auto-completion key sequence to be entered. The default value
|
||
is 0.1 seconds.
|
||
5. =auto-completion-idle-delay= is the number of seconds to wait before suggesting
|
||
completions. The default value is 0.2 seconds. Set to =nil= to disable
|
||
automatic suggestions (the ~TAB~ key will still perform completion).
|
||
|
||
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
|
||
auto-completion-complete-with-key-sequence-delay 0.1
|
||
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
|
||
auto-completion-enable-sort-by-usage nil)))
|
||
#+END_SRC
|
||
~jk~ is a good candidate for =auto-completion-complete-with-key-sequence= if
|
||
you don’t use it already.
|
||
|
||
** Snippets directories
|
||
The following directories are added by default:
|
||
- =~/.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)
|
||
|
||
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.
|
||
|
||
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
|
||
auto-completion-enable-snippets-in-popup t)))
|
||
#+END_SRC
|
||
|
||
** Tooltips
|
||
To enable automatic 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
|
||
|
||
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
|
||
(setq-default dotspacemacs-configuration-layers
|
||
'((auto-completion :variables
|
||
auto-completion-enable-help-tooltip 'manual)))
|
||
#+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/user-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 buffers via the
|
||
package =company-anaconda=.
|
||
|
||
In the file =packages.el= of the python layer:
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
;; Add the relevant packages to the layer
|
||
;; here it is `company-anaconda'
|
||
(setq python-packages
|
||
'(...
|
||
(company-anaconda :toggle (configuration-layer/package-used-p 'company))
|
||
...))
|
||
|
||
(defun python/init-company-anaconda ()
|
||
(use-package company-anaconda
|
||
:defer t
|
||
:init
|
||
(spacemacs|add-company-backends
|
||
:backends company-anaconda
|
||
:modes python-mode)))
|
||
#+END_SRC
|
||
|
||
** Completion back ends
|
||
Many spacemacs layers (e.g., python, html, haskell) configure company mode
|
||
backends to provide mode-specific completion. These modes will include
|
||
completion backends specified in the =spacemacs-default-company-backends=
|
||
variable. The defaults should work well, but you can configure this variable in
|
||
your =.spacemacs= file with (e.g.)
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq-default
|
||
dotspacemacs-configuration-layers
|
||
'((auto-completion :variables
|
||
spacemacs-default-company-backends '(company-files company-capf))))
|
||
#+END_SRC
|
||
|
||
** Improved faces
|
||
For nicer-looking faces, try adding the following to `custom-set-faces` in your dotspacemacs file.
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(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)))))
|
||
#+END_SRC
|
||
|
||
* Key bindings
|
||
** Company
|
||
|
||
| Key binding | Description |
|
||
|-------------+------------------------------------------------------------------------------------------------------|
|
||
| ~C-d~ | open minibuffer with documentation of thing at point in company dropdown |
|
||
| ~C-/~ | show candidates in Helm or Ivy (for fuzzy searching) |
|
||
| ~C-M-/~ | filter the company dropdown menu |
|
||
| ~M-h~ | show current candidate’s documentation in a tooltip (requires =auto-completion-enable-help-tooltip=) |
|
||
|
||
Vim Style:
|
||
|
||
| Key binding | Description |
|
||
|-------------+----------------------------------------------|
|
||
| ~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 |
|
||
|
||
Emacs style:
|
||
|
||
| Key binding | Description |
|
||
|-------------+------------------------------------------------|
|
||
| ~C-n~ | (emacs style) go down in company dropdown menu |
|
||
| ~C-p~ | (emacs style) go up in company dropdown menu |
|
||
|
||
** 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 |
|
||
| ~RET~ | 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 |
|