Support for many languages is included in ycmd using various completion engines.
Not all are supported out of the box in Debian though. The following provides
an overview about which languages are supported and/or need additional packages
and which are currently not supported.


| Language       | Engine                 | Status                     |
|----------------|------------------------|----------------------------|
| C/C++          | clangd                 | Supported out of the box   |
| C/C++          | libclang1              | Supported out of the box   |
| C/C++          | ccls                   | Supported out of the box   |
| Python 2 & 3   | python3-jedi           | Supported out of the box   |
| TypeScript     | node-typescript        | Supported out of the box   |
| JavaScript     | node-typescript or tern| Supported out of the box   |
| Fortran        | fortran-language-server| Supported out of the box * |
| Go             | gopls                  | Requires 3rdparty install  |
| C#             | OmniSharp-roslyn       | Untested 3rdparty install  |
| Java           | jdt.ls                 | Unsupported                |
| Rust           | rust-analyzer          | Unsupported                |

A few more can be added with 3rdparty installs and `language_server` setting.
See https://github.com/ycm-core/lsp-examples for examples, but note that these
are neither supported by upstream nor by Debian and can be quite buggy.


Configuring ycmd
----------------

Upstream ycmd is intended to be configured by each client individually.
If we refer here to a config option it will be the one named in
`/usr/lib/ycmd/ycmd/default_settings.json`, but do NOT modify that file –
desperate what its name suggests it will be ignored by most clients.
You will have to check the configuration of your client for how the option
is named there, but they are usually quite similar. vim-youcompleteme e.g.
uses `g:ycm_` as prefix so `use_clangd` is `g:ycm_use_clangd` there.


C/C++
-----

The package contains the libclang1-based engine, but prefers (as upstream does)
the newer clangd-based engine if available. Install the `clangd` package for this.
You can disable this preference with the option `use_clangd` set to `0`. If you
want to use a version-specific clangd you need to set `clangd_binary_path`.
You can also use `ccls` via the generic `language_server` facility (patched to be
included by default), but you will need to set `use_clang` and `use_clangd` to `0`
and – of course – install the `ccls` package (Note that `use_clang` is a Debian
specific option).


TypeScript & JavaScript completion
----------------------------------

Support for the old Tern-based completer you could install with npm in your
home directory is still included and will be used if present for backward-
compatibility, but upstream recommends and uses for new users the tsserver-
based completer provided by the `node-typescript` package in Debian.


Fortran completion
------------------

You just need to install the `fortran-language-server` package. Note that ycmd
upstream does not official support this completer. It is also producing messages
on stderr, but it seems like these can be ignored. Added via the `language_server`
setting, so if you set this option yourself make sure to include Debian's default.


Go completion
-------------

Installing `golang` and running `GO111MODULE=on go get golang.org/x/tools/gopls@latest`
as the user which should have the completion available should download and install
gopls in `~/go/bin/gopls` which this version of ycmd is patch to support.


C# completion
-------------

You will need at least `mono` and `OmniSharp.exe` from the omnisharp-roslyn project.
A patch is included to allow the exe to be placed in `/usr/local/bin`, but this
completion is currently not tested for Debian. Feel free to provide feedback
if you made it work.


Java completion
---------------

The jdt.ls engine is currently not packaged in Debian so far and even
supporting unpackaged versions seems difficult. If you are interested and
willing to supply a patch you are more than welcome.


Rust completion
---------------

rust-analyzer is not being available in Debian so far,
so Rust completion is currently not tested nor supported in Debian.
If you are interested and willing to supply a patch you are more than welcome.
