Moving to Neovim
Date: Message-Id: https://www.5snb.club/posts/2020/moving-to-neovim/
This is a hopefully small post about how I got from my vim setup to a neovim setup.
This does not keep the same config working on vim, and just copies over what I still need. Vim stays functional, they’re running on 2 completely separate configs.
Installing Neovim
pacman -S neovim
You’ll also want to set your EDITOR
environment variable to nvim
, but I did that at the end
once I knew it actually works.
Clean startup
Initially, I was getting errors complaining about
Error detected while processing /home/jess/dotfiles/vim/.config/vim/vimrc:
line 13:
E484: Cannot open file /usr/share/nvim/runtime/defaults.vim
E576: Failed to parse ShaDa file: extra bytes in msgpack string at position 3
Press ENTER or type command to continue
I wasn’t expecting neovim to try and load my existing vimrc. I checked the manual and found this in
in the ENVIRONMENT
section.
VIMINIT
Ex commands to be executed at startup.
:help VIMINIT
My VIMINIT
was set to let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC
. I did this
so that I can keep all of vim’s configuration in $XDG_CONFIG_HOME
, and not scattered throughout
my home directory.
An easy fix for this that doesn’t break anything else is to define these only when I’m running vim,
and not anything else. I can do this using a shell alias, and removing the export
’s for the
environment variables, which make them available to all commands.
vim() {
VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC' \
VIMDOTDIR="$XDG_CONFIG_HOME/vim" \
command vim $@
}
It’s worth noting that this will break vim for anything that calls it indirectly,
since in that case the alias won’t be executed. A true fix for this would be to put that command
ahead of the actual vim
in your $PATH
, making sure to call the real vim in it.
I need to log out and log back in in order to stop VIMINIT being globally set, since my login shell
itself has it set. This probably wouldn’t be an issue if I used a display manager, but I just log
in and type startx
. A workaround would be to export blank settings for these, but I just decided
to log out and log back in.
One re-login later, and executing nvim
starts up cleanly.
Configuration
My vimrc has a fair amount of stuff in it, some of which isn’t really needed anymore.
Notably
set runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIM,$VIMRUNTIME
set dir=~/.cache/vim
set viminfo+=n$XDG_CACHE_HOME/vim/viminfo
and code for bracketed paste (Which, to be honest, I’m not sure if it even does anything on my system. Might as well get rid of it then).
I’m removing execute pathogen#infect()
, as I’ll be using the native package manager (Not neovim
exclusive, introduced in vim 8.0) instead.
Colour
I have a custom version of base16-default.vim that removes background colour,
since I’m a weird person who uses transparent terminals. Because of this, I
don’t manage it as a package. Copying it to colors/base16-default.vim
works
fine, and now my neovim starts up without complaints.
Packages
Now I can begin to move my packages over to use vim’s package manager.
Vim’s package manager layout seems to be built to be managed by a system package manager, so it’s somewhat more nested than the directory would be if you were using pathogen.
If you want to see the full directory structure, use :help packages
on a
modern (neo)vim, but for my use case, I’ll just make a pack/packages/start
directory, as I want all packages to always load. Then it’s the same as
pathogen from there.
I use git submodules to manage my packages (since my dotfiles themselves are in
git), so adding a new package is a matter of going to pack/packages/start
and
running git submodule add <repo URL>
.
Final Thoughts
It’s been fun to try to switch to neovim, and seeing how minimal I can get my config (by adding sensible.vim and sleuth.vim to outsource my configuration to someone else, and auto detection respectively. I’ll probably do more tweaking of my config, but for now, this is fine.)
I’m also getting a bug where when I append to the end of a markdown document, the folds aren’t
updating. This happened both with vim-pandoc and
vim-markdown-folding which is what I’m using
now, so I’m assuming it’s a bug with neovim’s recalculation of foldmethod=expr
lines.
Using zx
to recalculate folds works, so I might just bind that to happen whenever I leave insert
mode. Copy pasting a line at the end of the document seems to work.
I don’t care enough to figure out why it’s happening so I’m just going to deal with it until it pisses me off enough.