半瓶水折腾Vim记(Portable gVim安装插件管理vim-plug)
Download plug.vim and put it in the "autoload" directory (in normal version, default path is ~/vimfiles/autoload) //对于Portable的GVim,autoload的位置: \util_gVimPortable\App\vim\vim80\autoload\plug.vim,那就简单的把从链接下载好的plug.vim文件放进这个目录中。
Vim
Unix
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
You can automate the process by putting the command in your Vim configuration file as suggested here.
Windows (PowerShell)
md ~\vimfiles\autoload
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
(New-Object Net.WebClient).DownloadFile(
$uri,
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
"~\vimfiles\autoload\plug.vim"
)
)
Usage
Add a vim-plug section to your ~/.vimrc
(or stdpath('config') . '/init.vim'
for Neovim) //vimrc的位置:\util_gVimPortable\Data\settings\_vimrc
- Begin the section with
call plug#begin()
- List the plugins with
Plug
commands call plug#end()
to update&runtimepath
and initialize plugin system- Automatically executes
filetype plugin indent on
andsyntax enable
. You can revert the settings after the call. e.g.filetype indent off
,syntax off
, etc.
- Automatically executes
Example
" Specify a directory for plugins
" - For Neovim: stdpath('data') . '/plugged'
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')
" Make sure you use single quotes
" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'
" Any valid git URL is allowed
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Multiple Plug commands can be written in a single line using | separators
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" On-demand loading
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Using a non-master branch
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }
" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'
" Initialize plugin system
call plug#end()
如果希望安装新插件,首先找到其在http://github.com的网址,然后将其追加至vimrc配置文件中的call plug#begin()
和call plug#end()
之间,最后执行以下命令安装所有引用的插件:
:PlugInstall
你也可以使用以下命令,指定安装特定的插件:
:PlugInstall gist-vim
卸载插件
如果希望卸载插件,请先在vimrc配置文件中注释或者删除对应插件的配置信息,然后再执行以下命令:
:PlugClean
使用以下命令,可以更新vim-plug插件自身:
:PlugUpgrade
使用以下命令,可以批量更新所有已安装的插件:
:PlugUpdate
使用以下命令,可以查看当前已安装插件的状态信息:
:PlugStatus
//vimrc的位置:\util_gVimPortable\Data\settings\_vimrc
附:
vim-plug相关的命令用法
Commands
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
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 <Plug> -mappings |
for | On-demand loading: File types |
frozen | Do not update unless explicitly specified |
Global options
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_pwindow | above 12new | 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
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()
On-demand loading of plugins
" 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 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
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' }
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.py
endif
endfunction
Plug 'ycm-core/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 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:
let g:fzf_install = 'yes | ./install'
Plug 'junegunn/fzf', { 'do': g:fzf_install }
PlugInstall!
and PlugUpdate!
The installer takes the following steps when installing/updating a plugin:
git clone
orgit fetch
from its origin- Check out branch, tag, or commit and optionally
git merge
remote branch - If the plugin was updated (or installed for the first time)
- Update submodules
- Execute post-update hooks
The commands with the !
suffix ensure that all steps are run unconditionally.