Setup Nim With Neovim
Tags: nim, vim
Published: 2020-01-12 15:46:28

---
title: Setup Nim With Neovim
published: true
date: 2020-01-12 00:00:00 UTC
tags: Nim, Vim
canonical_url: https://www.rockyourcode.com/setup-nim-with-neovim/
---


> Use Neovim as your Nim IDE

# Why Nim?

> Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. [^1]

**[Nim][nimlang]** resembles Python, but the language is significantly faster and statically compiled. Nim comes with meta-programming abilities (like a LISP). You can compile a Nim program into a stand-alone C binary that runs on every system.

Read more about Nim on the **[official homepage][nimlang]**.

# Why NeoVim?

**NeoVim** is a [superb text-editor based on Vim][neovim].  
With NeoVim you can seamlessly edit text, jump to the terminal and run commands, etc.  
You don't need the mouse, and thus your workflow can be much faster than with an editor like VS Code.


The following instructions both work with Vim 8 and NeoVim.

# Install Nim

[Install Nim](https://nim-lang.org/install.html). I use **[choosenim][choosenim]** to manage my installations.

```sh
curl https://nim-lang.org/choosenim/init.sh -sSf | sh
choosenim stable
```

# Language Server

Install a language server protocol implementation for Vim. **[LanguageClient-neovim][languageclient]** is the only one I could get working with several languages (Elixir, Reason, JavaScript, Nim).

For example, with [vim-plug](https://github.com/junegunn/vim-plug):

```vim
Plug 'autozimu/LanguageClient-neovim', {
    \ 'branch': 'next',
    \ 'do': 'bash install.sh',
    \ }
```

Install **[nimlsp][nimlsp]**. Run this command in your terminal:

```sh
nimble install nimlsp
```

Configure the plugins within your vim configuration (`~/.vimrc` or similar):

```vim
set hidden

nnoremap <F5> :call LanguageClient_contextMenu()<CR>

let g:LanguageClient_serverCommands = {
\   'nim': ['~/.nimble/bin/nimlsp'],
\ }

```

The setup specifies the location of nimlsp. On your computer, it might be different.

Now you can open a Nim file, and hit `F5`. The LanguageClient menu will pop up.  
You can fine-tune the LanguageClient configuration to your liking.  
Use `:h LanguageClient` within Vim to get more information.

[nimlsp][nimlsp] can be a bit peculiar about its setup. [The language server needs some of Nim's files in order to work properly.](https://github.com/PMunch/nimlsp/issues/22).  
You might want to check out the [GitHub repository][nimlsp] for further trouble-shooting.

# (Tab) Completion

You can use [Vim's inbuilt completion][vimtyping], but the easier way is to install a completion plugin.

**[VimCompletesMe][vimcompletesme]** is a minimal plugin that does everything I need.

```vim
Plug 'ajh17/VimCompletesMe'
```

# Linting and Formatting Code

> [ALE (Asynchronous Lint Engine)][ale] is a plugin providing linting (syntax checking and semantic errors) in NeoVim 0.2.0+ and Vim 8 while you edit your text files.

Install it with your package manager (or find alternative instructions on [GitHub](https://github.com/dense-analysis/ale#3-installation)):

```vim
Plug 'dense-analysis/ale'
```

Example setup in your `init.vim` (or `~/.vimrc`, etc.):

```bash
let g:ale_sign_error                  = '✘'
let g:ale_sign_warning                = '⚠'
highlight ALEErrorSign ctermbg        =NONE ctermfg=red
highlight ALEWarningSign ctermbg      =NONE ctermfg=yellow
let g:ale_linters_explicit            = 1
let g:ale_lint_on_text_changed        = 'never'
let g:ale_lint_on_enter               = 0
let g:ale_lint_on_save                = 1
let g:ale_fix_on_save                 = 1

let g:ale_linters = {
\   'nim':      ['nimlsp', 'nimcheck'],
\}

let g:ale_fixers = {
\   'nim':      ['nimpretty'],
\   '*':        ['remove_trailing_lines', 'trim_whitespace'],
\}
```

Improve ALE's performance by setting the linters you need and don't lint every time you type in something.  
Fix a file when you save or call `:ALEFix` manually.  
See `:h ale` for more information.

### Links

- [Nim language][nimlang]
- [NeoVim][neovim]

[^1]: [https://nim-lang.org/][nimlang]

[nimlang]: https://nim-lang.org/
[neovim]: https://neovim.io/
[choosenim]: https://github.com/dom96/choosenim
[languageclient]: https://github.com/autozimu/LanguageClient-neovim
[nimlsp]: https://github.com/PMunch/nimlsp
[ale]: https://github.com/dense-analysis/ale
[vimcompletesme]: https://github.com/ajh17/VimCompletesMe
[vimtyping]: https://georgebrock.github.io/talks/vim-completion/