vim-plug: Minimalist Vim & Neovim Plugin Manager
vim-plug does exactly one thing well: it turns a list of git repo paths in your vimrc into an installed, updated, diffable plugin set. The parallel, shallow-clone installer is the real draw — updating a stack of plugins finishes in seconds instead of one clone after another. It hasn't grown a registry, a UI, or dependency resolution, and that restraint reads as a decision, not a missing feature.
What is vim-plug?
vim-plug is a minimalist plugin manager for Vim and Neovim, shipped as a single script file you drop into your autoload directory. You list plugins between plug#begin() and plug#end() in your vimrc, then run :PlugInstall or :PlugUpdate to fetch them with parallel, shallow git clones. There's no separate registry or GUI, just a handful of commands and a plugin list you write yourself.
Key features of vim-plug
- ✓Single autoload file with zero external dependencies — copy plug.vim in and you're set up.
- ✓Parallel, shallow-clone installs and updates, so :PlugUpdate finishes fast and uses less disk space.
- ✓On-demand loading through the on (commands/mappings) and for (filetypes) options, so heavy plugins load only when needed.
- ✓Per-plugin branch, tag, or commit pinning for reproducible setups.
- ✓Post-update hooks via the do option — a shell command, a colon-prefixed Vim command, a lambda, or a function reference.
- ✓PlugDiff and PlugStatus for reviewing pending or completed changes, with an X keybinding to revert an update.
- ✓PlugSnapshot writes a script that restores your current plugin versions.
- ✓Support for externally managed plugins alongside the ones vim-plug installs itself.
Installing vim-plug
Installing vim-plug means putting one file, plug.vim, into your editor's autoload directory. On Unix, the README's curl command downloads it straight into place: curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim. On Windows, it gives a PowerShell equivalent that writes to ~/vimfiles/autoload/plug.vim. Neovim uses a different path entirely: stdpath('data')/site/autoload/plug.vim, which defaults to ~/.local/share/nvim/site/autoload/plug.vim on Unix and Linux, with a separate documented command for the Flatpak build. No build step. Once the file is in place, add a plug#begin()/plug#end() block to your vimrc or init.vim and run :PlugInstall.
Managing plugins with vim-plug
Add a vim-plug section to ~/.vimrc, or ~/.config/nvim/init.vim for Neovim: call plug#begin() to start, one Plug 'user/repo' line per plugin, call plug#end() to finish. Reload the file or restart Vim, then run :PlugInstall to install, :PlugUpdate to install or update, :PlugDiff to see what an update would change, or :PlugClean to remove plugins you've dropped from the list. Reload and go. The fuller command set adds :PlugUpgrade to update vim-plug itself, :PlugStatus to check plugin state, and :PlugSnapshot to write a script that restores the current versions. Per plugin, the options dictionary supports branch, tag, or commit, rtp for a plugin whose Vim files sit in a subdirectory, dir for a custom install path, as to rename it, do for a post-update hook, on and for for on-demand loading, and frozen to skip removal and updates. Defaults live in global variables: g:plug_threads (16), g:plug_timeout (60 seconds, Ruby/Python installers only), g:plug_retries (2), g:plug_shallow (1, meaning on), g:plug_window (-tabnew), and g:plug_url_format. Inside the plug window, D runs PlugDiff, S runs PlugStatus, U updates the selected range, R retries a failed task, and X inside PlugDiff reverts an update.
Why developers choose vim-plug
- ✓One file, no dependencies, and syntax you can pick up in minutes — no config-language boilerplate.
- ✓Parallel, shallow-clone installs make a big :PlugUpdate run noticeably fast and lighter on disk.
- ✓The README claims compatibility with every Vim release since 2006 and every Neovim release, so old configs don't break on upgrade.
- ✓PlugDiff plus the X-to-revert keybinding gives you a real way to inspect and undo an update before living with it.
- ✓The same plug#begin()/Plug/plug#end() model works in classic Vim script and in Neovim's Lua config via vim.fn['plug#'].
Limitations of vim-plug
- △No plugin registry or search — you need to already know the GitHub path of what you want.
- △On-demand loading via on/for is opt-in and, per the README's own note, usually unnecessary and a hacky workaround as a last resort, not a full lazy-loading framework.
- △g:plug_timeout and g:plug_retries only apply to the Ruby/Python install code paths, per the README, so behavior isn't identical across every environment.
- △No built-in dependency resolution between plugins; you manage load order and conflicts yourself.
Alternatives to vim-plug
Frequently asked questions about vim-plug
vim-plug supports Neovim directly: it documents a separate install path, Neovim's own autoload directory under stdpath('data') rather than Vim's ~/.vim, and the README states vim-plug works with every Neovim release.
vim-plug's main technical difference from Vundle is the installer: vim-plug fetches and updates plugins in parallel using shallow git clones, a feature the README highlights directly, while Vundle's classic workflow installs one plugin at a time. Both use a similar Plug-line-per-plugin vimrc syntax.
vim-plug's README includes a full Lua equivalent for Neovim: bind Plug to vim.fn['plug#'], call vim.call('plug#begin'), list plugins with Plug('user/repo') calls, then vim.call('plug#end'). The same install and update commands work afterward.
Delete the plugin's Plug line from your vimrc or init.vim, then run :PlugClean, which removes any installed plugin no longer listed. Add a bang, :PlugClean!, to skip the confirmation prompt and clean immediately.
Post-update hooks run automatically after a plugin installs or updates, set with the do option on that plugin's Plug line. The value can be a shell command, a Vim command prefixed with a colon, a lambda expression, or a reference to a Vim function that receives an info dictionary with the plugin's name, status, and force flag.
vim-plug supports lazy loading through the on option to load on a command or mapping and the for option to load on a filetype, what the README calls on-demand loading. The README itself cautions this is a last-resort workaround, not something most setups need, since a well-built plugin should already load lazily on its own.
The problem it solves
Vim itself has no built-in way to fetch, update, or remove third-party plugins from git, so you're left hand-managing runtime-path directories or writing your own install scripts. vim-plug's README frames its answer narrowly on purpose: one dependency-free file, syntax you can learn within minutes, and explicitly no feature bloat — a plugin installer, not a package-management platform with its own registry.
Best use cases
- •Bootstrapping a new vimrc or init.vim: add a few Plug lines, run :PlugInstall once, done.
- •Keeping a large plugin list in sync across machines, relying on parallel installs to keep :PlugUpdate quick.
- •Pinning a plugin to a specific branch, tag, or commit so a config doesn't drift on its own.
- •Running a post-install build step, the way the README's own examples do for vimproc.vim's make and YouCompleteMe's install.py.
- •Deferring heavy plugins with on/for so they load only for the command or filetype that needs them, like NERDTree on NERDTreeToggle or vim-fireplace for Clojure files.
- •Configuring plugins from init.lua in Neovim through the vim.fn['plug#'] Lua bridge instead of Vim script.
Who should try it — and who should skip
Try vim-plug if you edit a vimrc or init.vim by hand and want a plugin list you install with one command instead of managing runtime paths yourself. The README's compatibility claim covers old and new Vim and Neovim alike, so it fits a fresh Neovim setup just as well as a Vim config you've carried for years. Skip it if you specifically want a manager where lazy-loading is the default behavior instead of an opt-in on/for option, or you'd rather hand-manage plugins as git submodules with no manager at all.
Related repositories
Want a second opinion on vim-plug?
Ask an AI that can read this page — one click and you get its take on vim-plug.
