December 5, 2018

Migrating to minpac for Vim

I've just done an overhaul to my dotfiles and I wanted to document how and why I migrated from pathogen to minpac.

Why minpac

Minpac is described as a "minimal package manager for Vim 8". Ok, great. How is minpac different or better than the package managers that have been around for years (Vundle, vim-plug, pathogen, etc.)?

Now that Vim 8 ships with native package management, minpac builds on top of this functionality, allowing for a more lightweight plugin. Unlike its predesessors, minpac doesn't invent it's own solution for managing the runtimepath. Another Vim 8 feature that minpac leverages is the job control feature. This allows minpac to install and update plugins in parallel.

Configuring minpac

So for me, coming from pathogen, I can delete the ~/.vim/bundle directory and create the directory where minpac will live.

rm -rf ~/.vim/bundle
mkdir -p ~/.vim/pack/minpac/opt
git clone https://github.com/k-takata/minpac.git ~/.vim/pack/minpac/opt/minpac

From here, it's a matter of configuring your .vimrc for minpac. The following is a basic example of what you might include in your .vimrc. Minpac's install instructions offer something more simple than this but I like this example because it offers the ability to have a more flexible .vimrc for the case where you want to use the same .vimrc in different environments (like on a server that doesn't have your plugins installed).

" ~/.vimrc
" Try to load minpac.
packadd minpac

if !exists('*minpac#init')
  " minpac is not available.

  " Settings for plugin-less environment.
  " ...
else
  " minpac is available.
  " init with verbosity 3 to see minpac work
  call minpac#init({'verbose': 3})
  call minpac#add('k-takata/minpac', {'type': 'opt'})

  " Additional plugins here.
  call minpac#add('airblade/vim-gitgutter')
  call minpac#add('altercation/vim-colors-solarized')
  call minpac#add('itchyny/lightline.vim')
  call minpac#add('prettier/vim-prettier')
  call minpac#add('tpope/vim-commentary')
  call minpac#add('tpope/vim-endwise')
  call minpac#add('tpope/vim-fugitive')
  call minpac#add('tpope/vim-repeat')
  call minpac#add('tpope/vim-surround')
  " ...

  " minpac utility commands
  command! PackUpdate call minpac#update()
  command! PackClean call minpac#clean()
  command! PackStatus call minpac#status()

  " Plugin settings here.
  " ...
endif

" Common settings here.
"...

Here's minpac in action. After I open vim, I update all plugins specified in my .vimrc using the utility command :PackUpdate. After the update is finished, :PackStatus shows a summary of what changed.

minpac

Of course, minpac also works with Neovim if you prefer that over Vim 8. Check out the docs for a slightly different install process.

Happy Vim'ing! 🍻