plug.txt plug Last change: March 14 2024 PLUG - TABLE OF CONTENTS *plug* *plug-toc* ============================================================================== vim-plug |vim-plug| Getting Help |plug-getting-help| Usage |plug-usage| Example |plug-example| Example (Lua configuration for Neovim) |plug-examplelua-configuration-for-neovim| Commands |plug-commands| Plug options |plug-options| Global options |plug-global-options| Keybindings |plug-keybindings| Example: A small sensible Vim configuration |plug-example-a-small-sensible-vim-configuration| On-demand loading of plugins |plug-on-demand-loading-of-plugins| Post-update hooks |plug-post-update-hooks| PlugInstall! and PlugUpdate! |pluginstall-and-plugupdate| License |plug-license| VIM-PLUG *vim-plug* ============================================================================== A minimalist Vim plugin manager. < Getting Help >______________________________________________________________~ *plug-getting-help* - See {tutorial}{1} page to learn the basics of vim-plug - See {tips}{2} and {FAQ}{3} pages for common problems and questions - See {requirements}{4} page for debugging information & tested configurations - Create an {issue}{5} {1} https://github.com/junegunn/vim-plug/wiki/tutorial {2} https://github.com/junegunn/vim-plug/wiki/tips {3} https://github.com/junegunn/vim-plug/wiki/faq {4} https://github.com/junegunn/vim-plug/wiki/requirements {5} https://github.com/junegunn/vim-plug/issues/new < Usage >_____________________________________________________________________~ *plug-usage* Add a vim-plug section to your `~/.vimrc` (or `stdpath('config') . '/init.vim'` for Neovim) *plug#begin* *plug#end* 1. Begin the section with `call plug#begin([PLUGIN_DIR])` 2. List the plugins with `Plug` commands 3. `call plug#end()` to update 'runtimepath' and initialize plugin system - Automatically executes `filetype plugin indent on` and `syntax enable`. You can revert the settings after the call. e.g. `filetype indent off`, `syntax off`, etc. 4. Reload the file or restart Vim and run `:PlugInstall` to install plugins. Example~ *plug-example* > call plug#begin() " The default plugin directory will be as follows: " - Vim (Linux/macOS): '~/.vim/plugged' " - Vim (Windows): '~/vimfiles/plugged' " - Neovim (Linux/macOS/Windows): stdpath('data') . '/plugged' " You can specify a custom plugin directory by passing it as the argument " - e.g. `call plug#begin('~/.vim/plugged')` " - Avoid using standard Vim directory names like 'plugin' " Make sure you use single quotes " Shorthand notation for GitHub; translates to https://github.com/junegunn/vim-easy-align Plug 'junegunn/vim-easy-align' " Any valid git URL is allowed Plug 'https://github.com/junegunn/seoul256.vim.git' " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) Plug 'fatih/vim-go', { 'tag': '*' } " Using a non-default branch Plug 'neoclide/coc.nvim', { 'branch': 'release' } " Use 'dir' option to install plugin in a non-default directory Plug 'junegunn/fzf', { 'dir': '~/.fzf' } " Post-update hook: run a shell command after installing or updating the plugin Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } " Post-update hook can be a lambda expression Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " If the vim plugin is in a subdirectory, use 'rtp' option to specify its path Plug 'nsf/gocode', { 'rtp': 'vim' } " On-demand loading: loaded when the specified command is executed Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' } " On-demand loading: loaded when a file with a specific file type is opened Plug 'tpope/vim-fireplace', { 'for': 'clojure' } " Unmanaged plugin (manually installed and updated) Plug '~/my-prototype-plugin' " Initialize plugin system " - Automatically executes `filetype plugin indent on` and `syntax enable`. call plug#end() " You can revert the settings after the call like so: " filetype indent off " Disable file-type-specific indentation " syntax off " Disable syntax highlighting < Example (Lua configuration for Neovim)~ *plug-example-lua-configuration-for-neovim* In Neovim, you can write your configuration in a Lua script file named `init.lua`. The following code is the Lua script equivalent to the VimScript example above. > local vim = vim local Plug = vim.fn['plug#'] vim.call('plug#begin') -- Shorthand notation for GitHub; translates to https://github.com/junegunn/vim-easy-align Plug('junegunn/vim-easy-align') -- Any valid git URL is allowed Plug('https://github.com/junegunn/seoul256.vim.git') -- Using a tagged release; wildcard allowed (requires git 1.9.2 or above) Plug('fatih/vim-go', { ['tag'] = '*' }) -- Using a non-default branch Plug('neoclide/coc.nvim', { ['branch'] = 'release' }) -- Use 'dir' option to install plugin in a non-default directory Plug('junegunn/fzf', { ['dir'] = '~/.fzf' }) -- Post-update hook: run a shell command after installing or updating the plugin Plug('junegunn/fzf', { ['dir'] = '~/.fzf', ['do'] = './install --all' }) -- Post-update hook can be a lambda expression Plug('junegunn/fzf', { ['do'] = function() vim.fn['fzf#install']() end }) -- If the vim plugin is in a subdirectory, use 'rtp' option to specify its path Plug('nsf/gocode', { ['rtp'] = 'vim' }) -- On-demand loading: loaded when the specified command is executed Plug('preservim/nerdtree', { ['on'] = 'NERDTreeToggle' }) -- On-demand loading: loaded when a file with a specific file type is opened Plug('tpope/vim-fireplace', { ['for'] = 'clojure' }) -- Unmanaged plugin (manually installed and updated) Plug('~/my-prototype-plugin') vim.call('plug#end') < More examples can be found in: - https://gitlab.com/sultanahamer/dotfiles/-/blob/master/nvim/lua/plugins.lua?ref_type=heads < Commands >__________________________________________________________________~ *plug-commands* *:PlugInstall* *:PlugUpdate* *:PlugClean* *:PlugUpgrade* *:PlugStatus* *:PlugDiff* *:PlugSnapshot* -------------------------------------+------------------------------------------------------------------ Command | Description ~ -------------------------------------+------------------------------------------------------------------ `PlugInstall [name ...] [#threads]` | Install plugins `PlugUpdate [name ...] [#threads]` | Install or update plugins `PlugClean[!]` | Remove unlisted plugins (bang version will clean without prompt) `PlugUpgrade` | Upgrade vim-plug itself `PlugStatus` | Check the status of plugins `PlugDiff` | Examine changes from the previous update and the pending changes `PlugSnapshot[!] [output path]` | Generate script for restoring the current snapshot of the plugins -------------------------------------+------------------------------------------------------------------ < Plug options >______________________________________________________________~ *plug-options* *-mappings* ------------------------+----------------------------------------------- Option | Description ~ ------------------------+----------------------------------------------- `branch` / `tag` / `commit` | Branch/tag/commit of the repository to use `rtp` | Subdirectory that contains Vim plugin `dir` | Custom directory for the plugin `as` | Use different name for the plugin `do` | Post-update hook (string or funcref) `on` | On-demand loading: Commands or -mappings `for` | On-demand loading: File types `frozen` | Do not update unless explicitly specified ------------------------+----------------------------------------------- < Global options >____________________________________________________________~ *plug-global-options* *g:plug_threads* *g:plug_timeout* *g:plug_retries* *g:plug_shallow* *g:plug_window* *g:plug_pwindow* *g:plug_url_format* --------------------+-----------------------------------+----------------------------------------------------------------------------------- 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` | `-tabnew` | Command to open plug window `g:plug_pwindow` | `vertical rightbelow new` | Command to open preview window in `PlugDiff` `g:plug_url_format` | `https://git::@github.com/%s.git` | `printf` format to build repo URL (Only applies to the subsequent `Plug` commands) --------------------+-----------------------------------+----------------------------------------------------------------------------------- < Keybindings >_______________________________________________________________~ *plug-keybindings* - `D` - `PlugDiff` - `S` - `PlugStatus` - `R` - Retry failed update or installation tasks - `U` - Update plugins in the selected range - `q` - Close the window - `:PlugStatus` - `L` - Load plugin - `:PlugDiff` - `X` - Revert the update < Example: A small sensible Vim configuration >_______________________________~ *plug-example-a-small-sensible-vim-configuration* > call plug#begin() Plug 'tpope/vim-sensible' call plug#end() < < On-demand loading of plugins >______________________________________________~ *plug-on-demand-loading-of-plugins* > " NERD tree will be loaded on the first invocation of NERDTreeToggle command Plug 'preservim/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 lazily loaded on demand Plug 'junegunn/goyo.vim', { 'for': 'markdown' } autocmd! User goyo.vim echom 'Goyo is now loaded!' < The `for` option is generally not needed as most plugins for specific file types usually don't have too much code in the `plugin` directory. You might want to examine the output of `vim --startuptime` before applying the option. < Post-update hooks >_________________________________________________________~ *plug-post-update-hooks* There are some plugins that require extra steps after installation or update. In that case, use the `do` option to describe the task to be performed. > Plug 'Shougo/vimproc.vim', { 'do': 'make' } Plug 'ycm-core/YouCompleteMe', { 'do': './install.py' } < If the value starts with `:`, it will be recognized as a Vim command. > Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' } < To call a Vim function, you can pass a lambda expression like so: > Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } < If you need more control, you can pass a reference to a Vim function that takes a dictionary 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.py endif endfunction Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') } < A post-update hook is 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 the `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: *g:fzf_install* > let g:fzf_install = 'yes | ./install' Plug 'junegunn/fzf', { 'do': g:fzf_install } < < PlugInstall! and PlugUpdate! >______________________________________________~ *pluginstall-and-plugupdate* The installer takes the following steps when installing/updating a plugin: 1. `git clone` or `git fetch` from its origin 2. Check out branch, tag, or commit and optionally `git merge` remote branch 3. If the plugin was updated (or installed for the first time) 1. Update submodules 2. Execute post-update hooks The commands with the `!` suffix ensure that all steps are run unconditionally. < License >___________________________________________________________________~ *plug-license* MIT ============================================================================== vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap: