Lockfiles for your Vim Plugins
I recently decided to update my Vim plugins after a long time - bad move. After a single
:PlugUpdate command, I suddenly found my theme broken and even other plugins like
Airline not working as expected.
Though it was easy to figure out that something had broken in a newer version of the
material theme I was using, it took me a while to pinpoint the exact
commit responsible in the repo and revert back to it. Fortunately, the only thing broken
was the theme and not another feature that would hinder my work or productivity
considerably.
So I started wondering - No plugin or dependency manager for a modern programming
language goes without a locking system. There is package.lock and yarn.lock for
Javascript, Gemfile.lock for Ruby, mix.lock for Elixir - so why isn’t it the same for
plugins for text editors like Vim, VS Code or Atom?
Vim-Plug Lockfiles
I didn’t find a decent answer, but at least for vim-plug (my plugin manager
for Vim), I found a handy command called :PlugSnapshot that generates
an executable Vim-script snapshot of all the currently installed plugins.
This isn’t a “lockfile” per se, but pretty close to one. To generate it, you can call the command along with the location to save it as an argument:
:PlugSnapshot ~/.dotfiles/Vim/plug.snapshotTo restore plugins from a previously generated lockfile/snapshot, you can run this in your shell:
$ vim -S ~/.dotfiles/Vim/plug.snapshotOr within Vim:
:source ~/.dotfiles/Vim/plug.snapshotIf you track the snapshot in Git or another VCS, like I do, you can easily diff the snapshot to previous versions if something breaks or changes unexpectedly.
Custom Command
Since the snapshot isn’t automatically generated whenever plugins are updated, it’s easy to forget to call it or even accidentally save it to a different path.
It’s a good thing it’s Vim, so we can define a custom command to do it for us:
command UpdatePlugins
\ PlugUpdate | PlugSnapshot! ~/.dotfiles/Vim/plug.snapshotNow whenever you run :UpdatePlugins in Vim, it’ll automatically update the snapshot as
well.