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 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.

Why NeoVim?

NeoVim is a superb text-editor based on Vim.
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. I use choosenim to manage my installations.

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

Language Server

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

For example, with vim-plug:

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

Install nimlsp. Run this command in your terminal:

nimble install nimlsp

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

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 can be a bit peculiar about its setup. The language server needs some of Nim’s files in order to work properly..
You might want to check out the GitHub repository for further trouble-shooting.

(Tab) Completion

You can use Vim’s inbuilt completion, but the easier way is to install a completion plugin.

VimCompletesMe is a minimal plugin that does everything I need.

Plug 'ajh17/VimCompletesMe'

Linting and Formatting Code

ALE (Asynchronous Lint Engine) 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):

Plug 'dense-analysis/ale'

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

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.


  1. https://nim-lang.org/ ↩︎