Extending a shared Vim configuration

The problem with a shared configuration

I manage my .vimrc via a dotfiles repository, which I probably take a little too much pride in. When I started sharing these dotfiles across machines I began to find it inconvenient when I needed to add machine-specific configuration for certain projects.

Making changes to my shared .vimrc would clutter my dotfiles repository with things that I never intended to commit. This would also apply for when I was installing plugins.

I could just ignore the diffs, but I personally prefer git status to be clean if I don't intend on committing the changes at some point.

How to extend a shared configuration per machine

The solution is to create a new package in Vim. By package, I refer to the following:

.vim/pack/<package-name>/

…where <package-name> is the name of the package.

In my dotfiles repository, I have defined the dfranklinau package, i.e.:

.vim/pack/dfranklinau/start/

…so to extend this shared configuration, I chose a generic package name of local:

.vim/pack/local/start/

All of the machine-specific plugins and Vim configuration can now be added under the local folder.

I have added this folder path to my .gitignore so that I won't clutter up my dotfile repository with unstaged changes.

Adding machine-specific configuration

To add machine-specific configuration, rather than changing .vimrc directly, a custom plugin should be created in the new "extends" package.

I did this following my Vim 8 package management guide. I created the following file and placed all of my project-specific Ale configuration inside:

.vim/pack/local/start/local/plugin/vimrc.vim

vimrc.vim acts as a standard .vimrc file so there's no changes to how commands are formatted. Because it lives inside the start folder, it is also loaded automatically when Vim is opened.

Adding machine-specific plugins

To add machine-specific plugins, clone the plugins into the new "extends" package.

That's all there is to it.

No, really. That's it.