Developing with Elixir in Vim
Using (Neo)Vim is surprisingly enjoyable after the initial hurdle.
Language support for Elixir also works fine in Vim.
Plugins⌗
I use minpac as my package manager. VimCasts has a good introduction video on minpac if you’re interested.
Add these plugins to your ~/.vimrc
:
- elixir-editors/vim-elixir
- optional: tpope/endwise for automatically adding
end
afterdef
,do
, etc. - optional: dense-analysis/ale for fixing and linting files
Configuration:
" in `.vimrc` or `~/.config/nvim/init.vim`
syntax on
filetype plugin indent on
set laststatus=2
set wildmenu
Elixir Language Server⌗
You need the Elixir Language Server as a backend/integration tool.
Either head over to the original elixir-ls (slow development at the moment) or the more current fork elixir-lsp elixir-ls fork.
You need to clone the repository.
$ git clone git@github.com:elixir-lsp/elixir-ls.git
$ cd elixir-ls
$ mix deps.get
$ mix compile
$ MIX_ENV=prod mix elixir_ls.release
This creates a folder release
which includes an executable, for example release/language_server.sh
(.bat
for Windows).
You need the path to that file for ALE support.
ALE⌗
ALE acts as the client for the Elixir Language Server. Setup for ALE also needs to go into your vim settings (~/.vimrc
):
" in `.vimrc` or `~/.config/nvim/init.vim`
let g:ale_linters = {
\ 'elixir': ['elixir-ls'],
\}
let g:ale_fixers = {
\ 'elixir': ['mix_format'],
\}
You also have to tell ALE where the language server is:
" in `.vimrc` or `~/.config/nvim/init.vim`
let g:ale_elixir_elixir_ls_release='~/<PATH-TO-YOUR-RELEASE>'
Only specify the path, not the file itself (language_server.sh
or language_server.bat
).
Now, you can use the command :ALEFix
in Vim to fix your files.
I chose the following config options:
" in `.vimrc` or `~/.config/nvim/init.vim`
let g:ale_completion_enabled = 1
let g:ale_sign_error = '✘'
let g:ale_sign_warning = '⚠'
let g:ale_lint_on_enter = 0
let g:ale_lint_on_text_changed = 'never'
highlight ALEErrorSign ctermbg=NONE ctermfg=red
highlight ALEWarningSign ctermbg=NONE ctermfg=yellow
let g:ale_linters_explicit = 1
let g:ale_lint_on_save = 1
let g:ale_fix_on_save = 1
noremap <Leader>ad :ALEGoToDefinition<CR>
nnoremap <leader>af :ALEFix<cr>
noremap <Leader>ar :ALEFindReferences<CR>
"Move between linting errors
nnoremap ]r :ALENextWrap<CR>
nnoremap [r :ALEPreviousWrap<CR>
Better Language Client Support⌗
ALE is great for linting and fixing files, but it can make VIM slow.
Alternatively, you can use a dedicated language server plugin, for example LanguageClient-neovim (works for Vim8 and NeoVim).
You can find a guide here.
Further Reading⌗
- How to use Elixir LS with Vim by Mitchell Hanberg
- Emacs - Elixir Setup Configuration Wiki
- How I configure Vim to work with Elixir without much clutter by Hauleth - and forum post