Hello,

I'm new to Nim and I wanted to use Vim/NeoVim as my main editor.

Here's my setup with language server support, etc.

Maybe it helps someone else.

Prerequisites:

  * NeoVim or Vim8 installed
  * Nim installed



The original blog post (with better formatting) is here: 
[https://www.rockyourcode.com/setup-nim-with-neovim](https://www.rockyourcode.com/setup-nim-with-neovim)/

# 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):
    
    
    Plug 'autozimu/LanguageClient-neovim', {
        \ 'branch': 'next',
        \ 'do': 'bash install.sh',
        \ }
    
    Run

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

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'],
    \ }
    
    Run

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.
    
    
    Plug 'ajh17/VimCompletesMe'
    
    Run

# 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)):
    
    
    Plug 'dense-analysis/ale'
    
    Run

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'],
    \}
    
    Run

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](https://nim-lang.org/)
  * [NeoVim](https://neovim.io/)


Reply via email to