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.snapshot
To restore plugins from a previously generated lockfile/snapshot, you can run this in your shell:
$ vim -S ~/.dotfiles/Vim/plug.snapshot
Or within Vim:
:source ~/.dotfiles/Vim/plug.snapshot
If 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.snapshot
Now whenever you run :UpdatePlugins
in Vim, it’ll automatically update the snapshot as
well.