# C++ Editor/IDE Setup

## CLion

Follow the **Compilation Database** instructions below to create the
appropriate project description file in the fuchsia root directory.

Then in CLion choose *Import Project from Sources* and select the
fuchsia root directory.

### CLion Performance Tweaks

To improve performance you can try some or all of the following. They
are only suggestions, we recommend checking with directly with JetBrains
at <https://intellij-support.jetbrains.com/hc> to be sure what works
best for your environment.

##### Exclude Directories

To speed up indexing time you can exclude directories you are not
working with. You can do that in the Project View by
right-clicking each directory and choosing
*Mark directory as->Excluded*. Note the affected configuration is stored
in `<project>/.idea/misc.xml`

See
[Control Source, Library, and Exclude Directories \- Help \| CLion](https://www.jetbrains.com/help/clion/controlling-source-library-and-exclude-directories.html)
for more information.

##### Unregister Git Repositories

The fuchsia source tree has a fair number of git repositories. Scanning
them can use CPU cycles for CLion. You can unregister the git
repositories you are not working on under
*File -> Settings -> Version Control*. They will still be listed there
so you can add them back later if needed.

##### Tune JVM Options and Platform Properties

See
[Tuning CLion \- Help \| CLion](https://www.jetbrains.com/help/clion/tuning-the-ide.html)
for general tips on tweaking CLion JVM Options and Platform Properties.
As that link suggests, contact CLion support for instructions
regarding the options and values that might help you with whatever issue
you are trying to solve.

## Vim

See [Helpful Vim tools for Fuchsia development](/scripts/vim/README.md).

## Visual Studio Code (VS Code) {#visual-studio-code}

There are multiple VS Code setups known to work to different degrees. The
sections below describe the different setups (pick one).

### clangd

Install
[vscode-clangd](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd).
Disable the default C/C++ extension if you have it installed.

In settings, add:

```
"clangd.path": "<absolute path to fuchsia root directory>/prebuilt/third_party/clang/<platform>/bin/clangd",
```

Note: The path to clangd does need to be absolute.

Finally, follow the **Compilation Database** instructions below to
generate the `compile_commands.json` in the fuchsia root directory. Then
reload VS Code to enjoy the results.

You may also benefit from enabling background indexing and clang-tidy using the following settings:

```
"clangd.arguments": [
    "-clang-tidy",
    "-background-index"
]
```

Further details on clangd setup can be found [here](https://clang.llvm.org/extra/clangd/Installation.html).

### Default VS Code C++ extension

Install the default [C/C++ extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)
suggested by VS Code.

You can use [tasks](https://code.visualstudio.com/docs/editor/tasks) to
configure a compilation step.

## Compilation Database (fx compdb)

A [Compilation
Database](https://clang.llvm.org/docs/JSONCompilationDatabase.html) file
can be generated using `fx compdb`. This will create/update the file
`compile_commands.json` in the fuchsia root directory. When you add,
delete, or rename source files the command needs to be rerun to update
the `compile_commands.json` file.

Note that this file is only intended to help the IDE find and parse
the source files. Building should still be done with `fx build`.

Note: There is an ongoing issue where CLion shows compiler errors for a few
hundred files in the Fuchsia source code. Other files should work
fine in CLion.
