2015-12-02 14:23:39 +00:00
#+TITLE : YCMD layer
2015-06-10 16:44:30 +00:00
2018-09-19 03:54:47 +00:00
* Table of Contents :TOC_4_gh:noexport:
2017-05-22 14:16:12 +00:00
- [[#description ][Description ]]
2018-01-27 14:52:43 +00:00
- [[#features ][Features: ]]
2017-05-22 14:16:12 +00:00
- [[#install ][Install ]]
- [[#layer ][Layer ]]
- [[#ycmd ][YCMD ]]
- [[#other-requirements ][Other Requirements ]]
- [[#configuration ][Configuration ]]
- [[#activating-ycmd-in-a-major-mode ][Activating ycmd in a major mode ]]
- [[#getting-the-compilation-flags ][Getting the compilation flags ]]
2016-12-28 04:00:17 +00:00
- [[#functions ][Functions ]]
2018-12-05 03:03:03 +00:00
- [[#key-bindings ][Key bindings ]]
2015-06-10 16:44:30 +00:00
* Description
2018-01-27 14:52:43 +00:00
This layer adds [[https://github.com/abingham/emacs-ycmd ][emacs-ycmd ]] support.
** Features:
- [[https://github.com/Valloric/YouCompleteMe ][YouCompleteMe ]] based code-completion
- Integrations with company, flycheck, and eldoc
2015-06-10 16:44:30 +00:00
* Install
** Layer
2016-01-06 05:21:55 +00:00
To use this configuration layer, add it to your =~/.spacemacs= . You will need to
add =ycmd= to the existing =dotspacemacs-configuration-layers= list in this
file.
2015-06-10 16:44:30 +00:00
** YCMD
2017-04-25 15:42:58 +00:00
1) Install the =ycm= server. Installation instructions can be found [[https://github.com/Valloric/ycmd#user-content-building ][here ]].
2016-06-12 11:23:24 +00:00
2) Set the =ycmd-server-command= variable to reflect the path to the installation:
2018-09-19 03:54:47 +00:00
2018-10-17 04:03:28 +00:00
#+BEGIN_SRC emacs-lisp
(setq ycmd-server-command '("python" "/path/to/YouCompleteMe/third_party/ycmd/ycmd"))
#+END_SRC
2018-09-19 03:54:47 +00:00
2018-10-17 04:03:28 +00:00
Note that no filename expansions are done, so =~= -paths will not work out of the box.
If you need expansions, you can use Emacs’ s =file-truename= like this:
2018-09-19 03:54:47 +00:00
2018-10-17 04:03:28 +00:00
#+BEGIN_SRC emacs-lisp
(setq ycmd-server-command (list "python" (file-truename "~/some/path")))
#+END_SRC
2018-09-19 03:54:47 +00:00
2016-08-29 14:23:34 +00:00
3) By default, spacemacs configures ycmd for getting the compilation flags from either
2018-10-17 04:03:28 +00:00
a compile_commands.json or a .clang_complete file and get additionnal flags from a
.ycm_extra_flags file. If you do not like this behaviour, you can write your own
[[https://github.com/Valloric/YouCompleteMe/blob/master/README.md#c-family-semantic-completion ][.ycm_extra_conf.py file ]]. See [[#configuration ][Configuration ]] for more details.
2016-06-12 11:23:24 +00:00
4) Whitelist the file by adding the following to =.spacemacs= :
2018-09-19 03:54:47 +00:00
2018-10-17 04:03:28 +00:00
#+BEGIN_SRC emacs-lisp
;; In this example we whitelist everything in the Develop folder
(setq ycmd-extra-conf-whitelist '("~/Develop/ *"))
#+END_SRC
2018-09-19 03:54:47 +00:00
2016-06-12 11:23:24 +00:00
5) The completion is not going to work automatically until we actually force it:
2018-09-19 03:54:47 +00:00
2018-10-17 04:03:28 +00:00
#+BEGIN_SRC emacs-lisp
(setq ycmd-force-semantic-completion t)
#+END_SRC
2016-06-12 11:23:24 +00:00
2015-06-10 16:44:30 +00:00
** Other Requirements
This package requires the =auto-completion= layer in order to get actual
completion. The =syntax-checking= layer is required for flycheck support.
* Configuration
2016-08-29 14:23:34 +00:00
** Activating ycmd in a major mode
By default this layer only activates ycmd for =c++-mode= and =c-mode= .
2015-06-10 16:44:30 +00:00
2016-04-21 03:18:12 +00:00
If you want ycmd support in other modes you might just want to add it for
2015-06-10 16:44:30 +00:00
specific languages like:
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(add-hook 'c++-mode-hook 'ycmd-mode)
2015-06-10 16:44:30 +00:00
#+END_SRC
2016-08-29 14:23:34 +00:00
** Getting the compilation flags
Spacemacs uses its own ycmd global configuration file. If you prefer, you can
2017-04-25 15:42:58 +00:00
write your own [[https://github.com/Valloric/YouCompleteMe/blob/master/README.md#user-content-c-family-semantic-completion ][.ycm_extra_conf.py ]].
2016-08-29 14:23:34 +00:00
Spacemacs will search for a compile_command.json or fall back to a
.clang_complete file in all parent directories of the current translation unit.
Spacemacs will try to make up for missing files in the compile_commands.json
using heuristics described in global_conf.py.
The user can provide additionnal flags by writing a .ycm_extra_flags in any
parent directory of the current translation unit. This is particularly useful
when cross-compiling.
Example .ycm_extra_flags:
#+BEGIN_SRC conf
2018-09-19 03:54:47 +00:00
# Additionnal flags for ycmd
--sysroot="/path/to/your/toolchain/libc" # if you are cross-compiling
2016-08-29 14:23:34 +00:00
#+END_SRC
2018-09-19 03:54:47 +00:00
If your build system doesn’ t handle the creation of a compile_commands.json,
2016-08-29 14:23:34 +00:00
you can use tools such as [[https://github.com/rizsotto/Bear ][Bear ]] or [[https://pypi.python.org/pypi/scan-build ][scan-build ]] to generate it, which both work
with almost any build system.
2016-12-28 04:00:17 +00:00
* Functions
If ~company-ycmd~ is used, then a function
2017-11-05 14:55:32 +00:00
~ycmd/manual-semantic-company-completer~ is defined. This function is
2016-12-28 04:00:17 +00:00
useful if you want to get semantic completions only when you press a
keybinding; in larger projects ycmd may not be performant for as-you-type
auto-completion to work well. You can bind it like so:
#+BEGIN_SRC emacs-lisp
2018-09-19 03:54:47 +00:00
(global-set-key (kbd "<C-tab >") 'ycmd/manual-semantic-company-completer)
2016-12-28 04:00:17 +00:00
#+END_SRC
This function will automatically cancel out of any active completers, and offer
semantic completions. It will automatically make an exception when you are
completing includes; these do not count as semantic completion so the exception
2018-10-23 14:18:21 +00:00
is necessary for the key binding to work when completing includes.
2016-12-28 04:00:17 +00:00
2018-12-05 03:03:03 +00:00
* Key bindings
2015-06-10 16:44:30 +00:00
Adds ~SPC m g g~ go to definition binding to =c++-mode= as well as ~SPC m g G~
for the more imprecise but faster version.