A minimalist Vim plugin manager.
- Easier to setup: Single file. No boilerplate code required.
- Easier to use: Concise, intuitive syntax
- Super-fast parallel installation/update
(with any of
+python
,+python3
,+ruby
, or Neovim) - Creates shallow clones to minimize disk space usage and download time
- On-demand loading for faster startup time
- Can review and rollback updates
- Branch/tag support
- Post-update hooks
- Support for externally managed plugins
Download plug.vim and put it in ~/.vim/autoload
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Edit your .vimrc
call plug#begin('~/.vim/plugged')
" Make sure you use single quotes
Plug 'junegunn/seoul256.vim'
Plug 'junegunn/vim-easy-align'
" Group dependencies, vim-snippets depends on ultisnips
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" On-demand loading
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Using git URL
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' }
" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'
call plug#end()
Reload .vimrc and :PlugInstall
to install plugins.
Command | Description |
---|---|
PlugInstall [name ...] [#threads] |
Install plugins |
PlugUpdate [name ...] [#threads] |
Install or update plugins |
PlugClean[!] |
Remove unused directories (bang version will clean without prompt) |
PlugUpgrade |
Upgrade vim-plug itself |
PlugStatus |
Check the status of plugins |
PlugDiff |
See the updated changes from the previous PlugUpdate |
PlugSnapshot [output path] |
Generate script for restoring the current snapshot of the plugins |
Option | Description |
---|---|
branch /tag |
Branch or tag of the repository to use |
rtp |
Subdirectory that contains Vim plugin |
dir |
Custom directory for the plugin |
do |
Post-update hook (string or funcref) |
on |
On-demand loading: Commands or <Plug> -mappings |
for |
On-demand loading: File types |
frozen |
Do not update unless explicitly specified |
Flag | Default | Description |
---|---|---|
g:plug_threads |
16 | Default number of threads to use |
g:plug_timeout |
60 | Time limit of each task in seconds (Ruby & Python) |
g:plug_retries |
2 | Number of retries in case of timeout (Ruby & Python) |
g:plug_shallow |
1 | Use shallow clone |
g:plug_window |
vertical topleft new |
Command to open plug window |
g:plug_url_format |
https://git::@github.com/%s.git |
printf format to build repo URL |
D
-PlugDiff
S
-PlugStatus
R
- Retry failed update or installation tasksU
- Update plugins in the selected rangeq
- Close the window:PlugStatus
L
- Load plugin
:PlugDiff
X
- Revert the update
Example: A small sensible Vim configuration
call plug#begin()
Plug 'tpope/vim-sensible'
call plug#end()
" NERD tree will be loaded on the first invocation of NERDTreeToggle command
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
" Multiple commands
Plug 'junegunn/vim-github-dashboard', { 'on': ['GHDashboard', 'GHActivity'] }
" Loaded when clojure file is opened
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Multiple file types
Plug 'kovisoft/paredit', { 'for': ['clojure', 'scheme'] }
" On-demand loading on both conditions
Plug 'junegunn/vader.vim', { 'on': 'Vader', 'for': 'vader' }
" Code to execute when the plugin is loaded on demand
Plug 'Valloric/YouCompleteMe', { 'for': 'cpp' }
autocmd! User YouCompleteMe call youcompleteme#Enable()
for
option is generally not needed as most plugins for specific file types
usually don't have too much code in plugin
directory. You might want to
examine the output of vim --startuptime
before applying the option.
There are some plugins that require extra steps after installation or update.
In that case, use do
option to describe the task to be performed.
Plug 'Shougo/vimproc.vim', { 'do': 'make' }
Plug 'Valloric/YouCompleteMe', { 'do': './install.sh' }
If you need more control, you can pass a reference to a Vim function that takes a single argument.
function! BuildYCM(info)
" info is a dictionary with 3 fields
" - name: name of the plugin
" - status: 'installed', 'updated', or 'unchanged'
" - force: set on PlugInstall! or PlugUpdate!
if a:info.status == 'installed' || a:info.force
!./install.sh
endif
endfunction
Plug 'Valloric/YouCompleteMe', { 'do': function('BuildYCM') }
Both forms of post-update hook are executed inside the directory of the plugin
and only run when the repository has changed, but you can force it to run
unconditionally with the bang-versions of the commands: PlugInstall!
and
PlugUpdate!
.
Make sure to escape BARs and double-quotes when you write do
option inline
as they are mistakenly recognized as command separator or the start of the
trailing comment.
Plug 'junegunn/fzf', { 'do': 'yes \| ./install' }
But you can avoid the escaping if you extract the inline specification using a variable (or any Vimscript expression) as follows:
let g:fzf_install = 'yes | ./install'
Plug 'junegunn/fzf', { 'do': g:fzf_install }
See FAQ/Troubleshooting.
- Writing my own Vim plugin manager
- Vim plugins and startup time
Thoughts on Vim plugin dependency- Support for Plugfile has been removed since 0.5.0
MIT