# Editor integration for Zircon

## YouCompleteMe

[YouCompleteMe](https://valloric.github.io/YouCompleteMe/) is a semantic
code-completion engine. YouCompleteMe works natively with Vim but it can also be
integrated with other editors through [ycmd](https://github.com/Valloric/ycmd).

### Install YouCompleteMe in your editor

See the [installation
guide](https://github.com/Valloric/YouCompleteMe#installation).

**Note**: Installing YCM on MacOS with Homebrew is not recommended because of
library compatibility errors. Use the official installation guide instead.

#### gLinux (Googlers only)

(This applies to anyone compiling on gLinux, even if editing over SSHFS on
MacOS) Ignore the above. Search the Google intranet for "YouCompleteMe" for
installation instructions.

### Generate compilation database

YouCompleteMe (and other tools like clang-tidy) require a [JSON compilation
database](https://clang.llvm.org/docs/JSONCompilationDatabase.html) that
specifies how each file is compiled. This database is normally stored in a file
called `compile_commands.json`. There are multiple ways to generate this
database for Zircon.

#### compiledb-generator

[compiledb-generator](https://github.com/nickdiego/compiledb-generator) is the
recommended way to generate a compilation database. It works by running make in
no-op mode and parsing the output. Thus it may be less accurate than bear, but
it should be able to produce a complete database very quickly and without
requiring a clean build.

To use it, download it from GitHub and run (ensure that compiledb is in your PATH)

```bash
cd "${ZIRCON_DIR}"
compiledb -o compile_commands.json -n make <make args>
```

#### Bear

Bear intercepts `exec(3)` calls made during a build and scrapes commandlines
that look like C/C++ compiler invocations. Thus it is guaranteed to accurately
capture the commands used during compilation. However it can't incrementally
maintain a compilation database, so it requires performing a clean build.

##### Install Bear

You can try using your system's package manager (apt-get, brew) to install Bear,
but you will need version 2.2.1 or later to match the compiler names that Zircon
uses. Both homebrew's and Debian testing's versions are sufficiently new. You
can also fall back to installing it from
[GitHub](https://github.com/rizsotto/Bear).

##### Invoke Bear on the Zircon build system

You'll need to do this whenever the sources or makefiles change in a way that
affects includes or types, or when you add/delete/move files, though it doesn't
hurt to use a stale database.

As easy as:

```bash
cd "${ZIRCON_DIR}"
make clean
bear make -j$(getconf _NPROCESSORS_ONLN)
```

This will create a `compile_commands.json` file in the local directory.

### Use it

YouCompleteMe will use `compile_commands.json` to do code completion and find
symbol definitions/declarations. See your editor's YouCompleteMe docs for
details.

It should pick up the `json` file automatically. If you want to move it out of
the `zircon` tree, you can move the file to its parent directory.

## See also

For Fuchsia integration, see
https://fuchsia.googlesource.com/scripts/+/master/vim/README.md
