# Helpful Vim tools for Fuchsia development

## Features

The [`fuchsia.vim`](/scripts/vim/fuchsia.vim) script sets up Vim to do the
following:

*   Set paths so that `:find` and `gf` know how to find files.
*   Enable FIDL syntax highlighting (using `/lib/fidl/tools/vim/`).
*   Integrate basic build system so that `:make` builds and populates the
    QuickFix window.
*   Configure [YouCompleteMe](/docs/development/editors/youcompleteme.md) (YCM)
    to provide error checking, code completion, and source navigation within the
    Fuchsia tree.

## Installation

The steps are:

1.  [Update your login script](#update-your-login-script).
1.  [Run the fx set command](#run-the-fx-set-command).
1.  [Update your Vim startup file](#update-your-vim-startup-file).
1.  [Restart Vim to configure YouCompleteMe](#restart-vim-to-configure-ycm).
1.  [Build a compilation database](#build-a-compilation-database).

### Update your login script {#update-your-login-script}

Add the following line to your startup script (typically `~/.bashrc`):

```shell
export FUCHSIA_DIR=<your_fuchsia_source_directory>
```

### Run the fx set command {#run-the-fx-set-command}

This command uses the format `fx set [PRODUCT].[BOARD]`. For example:

```shell
fx set core.x64
```

### Update your Vim startup file {#update-your-vim-startup-file}

If the following line exists in your `~/.vimrc` file, remove it:

```shell
filetype plugin indent on
```

Then add the following lines to your `~/.vimrc`:

```shell
if $FUCHSIA_DIR != ""
  source $FUCHSIA_DIR/scripts/vim/fuchsia.vim
endif
filetype plugin indent on
```

### Restart Vim to configure YouCompleteMe {#restart-vim-to-configure-ycm}

Note: If you haven't installed YouCompleteMe, see
[this installation guide](https://github.com/ycm-core/YouCompleteMe#installation){:.external}
to install YCM on your workstation.

To configure YouCompleteMe (YCM), you need to source the
[`fuchsia.vim`](/scripts/vim/fuchsia.vim) file.

Restart your Vim to run the `source $FUCHSIA_DIR/scripts/vim/fuchsia.vim`
command in your `~/.vimrc` file (see
[Update your Vim startup file](#update-yout-vim-startup-file)).

To verify that your YCM works, place the cursor on an identifier in a `.cc` or
`.h` file in Vim, then hit `Ctrl+]` to navigate to the definition of the
identifier.

### Build a compilation database {#build-a-compilation-database}

YCM uses the
[compilation database](https://github.com/ycm-core/YouCompleteMe#option-1-use-a-compilation-database){:.external},
which is more reliable and efficient than the default
[`ycm_extra_config.py` configuration](/docs/development/editors/youcompleteme.md#generate_compilation_database).

To build a compilation database, run the following command:

```shell
fx compdb
```

## Auto-formatting

Google's [vim-codefmt](https://github.com/google/vim-codefmt) can auto-format
code on save. This can be installed using a package manager such as
[Vundle](https://github.com/VundleVim/Vundle.vim) or
[vim-plug](https://github.com/junegunn/vim-plug).

A plugin to format and syntax-highlight GN files is available
[separately](https://gn.googlesource.com/gn/+/refs/heads/master/misc/vim). The
following example `.vimrc` demonstrates how to turn on auto-formatting of GN
files using vim-plug and Fuchsia's prebuilt GN:

```
call plug#begin('~/.vim/plugged')
Plug 'google/vim-maktaba'
Plug 'google/vim-glaive'
Plug 'google/vim-codefmt'
Plug 'https://gn.googlesource.com/gn', { 'rtp': 'misc/vim' }
call plug#end()
call glaive#Install()

" Set gn path to the Fuchsia prebuilt.
let g:gn_path = systemlist('source ' . g:fuchsia_dir . '/tools/devshell/lib/vars.sh && echo $PREBUILT_GN')[0]
execute ':Glaive codefmt gn_executable="' . g:gn_path . '"'

augroup autoformat_gn
  autocmd!
  autocmd FileType gn AutoFormatBuffer gn
augroup END
```
