1 Commits

Author SHA1 Message Date
Junegunn Choi
d7f1846932 Deferred loading on autocmd (#event[#pattern])
e.g.
    Plug 'SirVer/ultisnips',  { 'on': '#InsertEnter' }
    Plug 'junegunn/goyo.vim', { 'on': ['Goyo', '#BufEnter#README'] }
2016-10-29 18:00:58 +09:00
9 changed files with 163 additions and 843 deletions

View File

@@ -1,6 +1,5 @@
language: ruby language: ruby
dist: trusty sudo: required
sudo: false
env: env:
global: global:
- DEPS=$HOME/deps - DEPS=$HOME/deps
@@ -31,11 +30,13 @@ install: |
ln -s /usr/bin/vim.nox ${DEPS}/bin/vim ln -s /usr/bin/vim.nox ${DEPS}/bin/vim
return return
elif [ "$ENV" == "neovim" ]; then elif [ "$ENV" == "neovim" ]; then
# https://github.com/neovim/bot-ci#nightly-builds # https://github.com/neovim/neovim/wiki/Installing-Neovim
eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) nightly-x64" sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:neovim-ppa/unstable
sudo apt-get update -y
sudo apt-get install -y neovim
mkdir -p ${DEPS}/bin mkdir -p ${DEPS}/bin
ln -s $(which nvim) ${DEPS}/bin/vim ln -s /usr/bin/nvim ${DEPS}/bin/vim
export VADER_OUTPUT_FILE=/dev/stderr
return return
fi fi
@@ -54,7 +55,6 @@ install: |
git clone --depth 1 https://github.com/vim/vim git clone --depth 1 https://github.com/vim/vim
cd vim cd vim
export PATH=/usr/bin:$PATH
./configure $C_OPTS ./configure $C_OPTS
make make
make install make install

21
LICENSE
View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2017 Junegunn Choi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -20,15 +20,13 @@ A minimalist Vim plugin manager.
[40/4]: https://raw.githubusercontent.com/junegunn/i/master/vim-plug/40-in-4.gif [40/4]: https://raw.githubusercontent.com/junegunn/i/master/vim-plug/40-in-4.gif
[nv]: http://neovim.org/ [nv]: http://neovim.org/
[startup-time]: https://github.com/junegunn/vim-startuptime-benchmark#result [startup-time]: http://junegunn.kr/images/vim-startup-time.png
### Installation ### Installation
[Download plug.vim](https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim) [Download plug.vim](https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim)
and put it in the "autoload" directory. and put it in the "autoload" directory.
#### Vim
###### Unix ###### Unix
```sh ```sh
@@ -36,55 +34,27 @@ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
``` ```
You can automate the process by putting the command in your Vim configuration ###### Neovim
file as suggested [here][auto].
[auto]: https://github.com/junegunn/vim-plug/wiki/tips#automatic-installation
###### Windows (PowerShell)
```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"
)
)
```
#### Neovim
###### Unix
```sh ```sh
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \ curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
``` ```
###### Windows (PowerShell) ###### Windows (PowerShell)
```powershell ```powershell
md ~\AppData\Local\nvim\autoload md ~\vimfiles\autoload
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' $uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
(New-Object Net.WebClient).DownloadFile( (New-Object Net.WebClient).DownloadFile($uri, $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("~\vimfiles\autoload\plug.vim"))
$uri,
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
"~\AppData\Local\nvim\autoload\plug.vim"
)
)
``` ```
### Getting Help ### Getting Help
- See [tutorial] page to learn the basics of vim-plug - See the [requirements] page for debugging information & tested configurations.
- See [tips] and [FAQ] pages for common problems and questions - See the [FAQ] for common problems and questions.
- See [requirements] page for debugging information & tested configurations - Create an [issue](https://github.com/junegunn/vim-plug/issues/new).
- Create an [issue](https://github.com/junegunn/vim-plug/issues/new)
[tutorial]: https://github.com/junegunn/vim-plug/wiki/tutorial
[tips]: https://github.com/junegunn/vim-plug/wiki/tips
[FAQ]: https://github.com/junegunn/vim-plug/wiki/faq [FAQ]: https://github.com/junegunn/vim-plug/wiki/faq
[requirements]: https://github.com/junegunn/vim-plug/wiki/requirements [requirements]: https://github.com/junegunn/vim-plug/wiki/requirements
@@ -95,15 +65,10 @@ Add a vim-plug section to your `~/.vimrc` (or `~/.config/nvim/init.vim` for Neov
1. Begin the section with `call plug#begin()` 1. Begin the section with `call plug#begin()`
1. List the plugins with `Plug` commands 1. List the plugins with `Plug` commands
1. `call plug#end()` to update `&runtimepath` and initialize plugin system 1. `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.
#### Example #### Example
```vim ```vim
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged') call plug#begin('~/.vim/plugged')
" Make sure you use single quotes " Make sure you use single quotes
@@ -114,7 +79,7 @@ Plug 'junegunn/vim-easy-align'
" Any valid git URL is allowed " Any valid git URL is allowed
Plug 'https://github.com/junegunn/vim-github-dashboard.git' Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Multiple Plug commands can be written in a single line using | separators " Group dependencies, vim-snippets depends on ultisnips
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" On-demand loading " On-demand loading
@@ -136,7 +101,7 @@ Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
" Unmanaged plugin (manually installed and updated) " Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin' Plug '~/my-prototype-plugin'
" Initialize plugin system " Add plugins to &runtimepath
call plug#end() call plug#end()
``` ```
@@ -156,16 +121,16 @@ Reload .vimrc and `:PlugInstall` to install plugins.
### `Plug` options ### `Plug` options
| Option | Description | | Option | Description |
| ----------------------- | ------------------------------------------------ | | ----------------------- | ----------------------------------------------------------- |
| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | | `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
| `rtp` | Subdirectory that contains Vim plugin | | `rtp` | Subdirectory that contains Vim plugin |
| `dir` | Custom directory for the plugin | | `dir` | Custom directory for the plugin |
| `as` | Use different name for the plugin | | `as` | Use different name for the plugin |
| `do` | Post-update hook (string or funcref) | | `do` | Post-update hook (string or funcref) |
| `on` | On-demand loading: Commands or `<Plug>`-mappings | | `on` | On-demand loading: Commands, `<Plug>`-mappings, or #autocmds |
| `for` | On-demand loading: File types | | `for` | On-demand loading: File types |
| `frozen` | Do not update unless explicitly specified | | `frozen` | Do not update unless explicitly specified |
### Global options ### Global options
@@ -215,6 +180,9 @@ Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Multiple file types " Multiple file types
Plug 'kovisoft/paredit', { 'for': ['clojure', 'scheme'] } Plug 'kovisoft/paredit', { 'for': ['clojure', 'scheme'] }
" On autocmd
Plug 'SirVer/ultisnips', { 'on': '#InsertEnter' }
" On-demand loading on both conditions " On-demand loading on both conditions
Plug 'junegunn/vader.vim', { 'on': 'Vader', 'for': 'vader' } Plug 'junegunn/vader.vim', { 'on': 'Vader', 'for': 'vader' }

View File

@@ -1,376 +0,0 @@
plug.txt plug Last change: November 27 2017
PLUG - TABLE OF CONTENTS *plug* *plug-toc*
==============================================================================
vim-plug
Pros.
Installation
Vim
Unix
Windows (PowerShell)
Neovim
Unix
Windows (PowerShell)
Getting Help
Usage
Example
Commands
Plug options
Global options
Keybindings
Example: A small sensible Vim configuration
On-demand loading of plugins
Post-update hooks
PlugInstall! and PlugUpdate!
Articles
License
VIM-PLUG *vim-plug*
==============================================================================
A minimalist Vim plugin manager.
https://raw.githubusercontent.com/junegunn/i/master/vim-plug/installer.gif
< Pros. >_____________________________________________________________________~
*plug-pros*
- Easier to setup: Single file. No boilerplate code required.
- Easier to use: Concise, intuitive syntax
- {Super-fast}{1} parallel installation/update (with any of `+job`, `+python`,
`+python3`, `+ruby`, or {Neovim}{2})
- Creates shallow clones to minimize disk space usage and download time
- On-demand loading for {faster startup time}{3}
- Can review and rollback updates
- Branch/tag/commit support
- Post-update hooks
- Support for externally managed plugins
{1} https://raw.githubusercontent.com/junegunn/i/master/vim-plug/40-in-4.gif
{2} http://neovim.org/
{3} https://github.com/junegunn/vim-startuptime-benchmark#result
< Installation >______________________________________________________________~
*plug-installation*
{Download plug.vim}{4} and put it in the "autoload" directory.
{4} https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Vim~
*plug-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}{5}.
{5} https://github.com/junegunn/vim-plug/wiki/tips#automatic-installation
>> 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"
)
)
<
Neovim~
*plug-neovim*
>> Unix~
>
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
<
>> Windows (PowerShell)~
>
md ~\AppData\Local\nvim\autoload
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
(New-Object Net.WebClient).DownloadFile(
$uri,
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
"~\AppData\Local\nvim\autoload\plug.vim"
)
)
<
< Getting Help >______________________________________________________________~
*plug-getting-help*
- See {tutorial}{6} page to learn the basics of vim-plug
- See {tips}{7} and {FAQ}{8} pages for common problems and questions
- See {requirements}{9} page for debugging information & tested configurations
- Create an {issue}{10}
{6} https://github.com/junegunn/vim-plug/wiki/tutorial
{7} https://github.com/junegunn/vim-plug/wiki/tips
{8} https://github.com/junegunn/vim-plug/wiki/faq
{9} https://github.com/junegunn/vim-plug/wiki/requirements
{10} https://github.com/junegunn/vim-plug/issues/new
< Usage >_____________________________________________________________________~
*plug-usage*
Add a vim-plug section to your `~/.vimrc` (or `~/.config/nvim/init.vim` for
Neovim):
*plug#begin* *plug#end*
1. Begin the section with `callplug#begin()`
2. List the plugins with `Plug` commands
3. `callplug#end()` to update 'runtimepath' and initialize plugin system
- Automatically executes `filetypepluginindenton` and `syntaxenable`.
You can revert the settings after the call. e.g. `filetypeindentoff`,
`syntaxoff`, etc.
Example~
*plug-example*
>
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/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()
<
*:PlugInstall*
Reload .vimrc and `:PlugInstall` to install plugins.
< Commands >__________________________________________________________________~
*plug-commands*
------------------------------------+-------------------------------------------------------------------
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` | Examine changes from the previous update and the pending changes
`PlugSnapshot[!][outputpath]` | Generate script for restoring the current snapshot of the plugins
------------------------------------+-------------------------------------------------------------------
< Plug options >______________________________________________________________~
*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 >____________________________________________________________~
*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` | `verticaltopleftnew` | Command to open plug window
`g:plug_pwindow` | `above12new` | 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*
*:PlugStatus* *:PlugDiff*
- `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 '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!'
<
`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.
< Post-update hooks >_________________________________________________________~
*plug-post-update-hooks*
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.py' }
<
If the value starts with `:`, it will be recognized as a Vim command.
*:GoInstallBinaries*
>
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 '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:
*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. `gitclone` or `gitfetch` from its origin
2. Check out branch, tag, or commit and optionally `gitmerge` 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 `!` suffix ensure that all steps are run unconditionally.
< Articles >__________________________________________________________________~
*plug-articles*
- {Writing my own Vim plugin manager}{11}
- {Vim plugins and startup time}{12}
- ~~{Thoughts on Vim plugin dependency}{13}~~
- Support for Plugfile has been removed since 0.5.0
{11} http://junegunn.kr/2013/09/writing-my-own-vim-plugin-manager
{12} http://junegunn.kr/2014/07/vim-plugins-and-startup-time
{13} http://junegunn.kr/2013/09/thoughts-on-vim-plugin-dependency
< License >___________________________________________________________________~
*plug-license*
MIT
==============================================================================
vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap:

245
plug.vim
View File

@@ -18,7 +18,7 @@
" " Any valid git URL is allowed " " Any valid git URL is allowed
" Plug 'https://github.com/junegunn/vim-github-dashboard.git' " Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" "
" " Multiple Plug commands can be written in a single line using | separators " " Group dependencies, vim-snippets depends on ultisnips
" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' " Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" "
" " On-demand loading " " On-demand loading
@@ -40,7 +40,7 @@
" " Unmanaged plugin (manually installed and updated) " " Unmanaged plugin (manually installed and updated)
" Plug '~/my-prototype-plugin' " Plug '~/my-prototype-plugin'
" "
" " Initialize plugin system " " Add plugins to &runtimepath
" call plug#end() " call plug#end()
" "
" Then reload .vimrc and :PlugInstall to install plugins. " Then reload .vimrc and :PlugInstall to install plugins.
@@ -61,7 +61,7 @@
" More information: https://github.com/junegunn/vim-plug " More information: https://github.com/junegunn/vim-plug
" "
" "
" Copyright (c) 2017 Junegunn Choi " Copyright (c) 2016 Junegunn Choi
" "
" MIT License " MIT License
" "
@@ -96,8 +96,8 @@ let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
let s:plug_tab = get(s:, 'plug_tab', -1) let s:plug_tab = get(s:, 'plug_tab', -1)
let s:plug_buf = get(s:, 'plug_buf', -1) let s:plug_buf = get(s:, 'plug_buf', -1)
let s:mac_gui = has('gui_macvim') && has('gui_running') let s:mac_gui = has('gui_macvim') && has('gui_running')
let s:is_win = has('win32') let s:is_win = has('win32') || has('win64')
let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) let s:nvim = has('nvim') && exists('*jobwait') && !s:is_win
let s:vim8 = has('patch-8.0.0039') && exists('*job_start') let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
let s:me = resolve(expand('<sfile>:p')) let s:me = resolve(expand('<sfile>:p'))
let s:base_spec = { 'branch': 'master', 'frozen': 0 } let s:base_spec = { 'branch': 'master', 'frozen': 0 }
@@ -121,9 +121,6 @@ function! plug#begin(...)
else else
return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
endif endif
if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp
return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
endif
let g:plug_home = home let g:plug_home = home
let g:plugs = {} let g:plugs = {}
@@ -193,14 +190,6 @@ function! s:ask_no_interrupt(...)
endtry endtry
endfunction endfunction
function! s:lazy(plug, opt)
return has_key(a:plug, a:opt) &&
\ (empty(s:to_a(a:plug[a:opt])) ||
\ !isdirectory(a:plug.dir) ||
\ len(s:glob(s:rtp(a:plug), 'plugin')) ||
\ len(s:glob(s:rtp(a:plug), 'after/plugin')))
endfunction
function! plug#end() function! plug#end()
if !exists('g:plugs') if !exists('g:plugs')
return s:err('Call plug#begin() first') return s:err('Call plug#begin() first')
@@ -222,7 +211,7 @@ function! plug#end()
continue continue
endif endif
let plug = g:plugs[name] let plug = g:plugs[name]
if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') if get(s:loaded, name, 0) || !has_key(plug, 'on') && !has_key(plug, 'for')
let s:loaded[name] = 1 let s:loaded[name] = 1
continue continue
endif endif
@@ -236,14 +225,20 @@ function! plug#end()
endif endif
call add(s:triggers[name].map, cmd) call add(s:triggers[name].map, cmd)
elseif cmd =~# '^[A-Z]' elseif cmd =~# '^[A-Z]'
let cmd = substitute(cmd, '!*$', '', '')
if exists(':'.cmd) != 2 if exists(':'.cmd) != 2
call s:assoc(lod.cmd, cmd, name) call s:assoc(lod.cmd, cmd, name)
endif endif
call add(s:triggers[name].cmd, cmd) call add(s:triggers[name].cmd, cmd)
elseif cmd[0] == '#' && exists('##'.split(cmd, '#')[0])
let tokens = split(cmd, '#')
let group = 'Plug/'.name
execute 'augroup' group
autocmd!
execute 'autocmd' tokens[0] get(tokens, 1, '*') printf('call s:lod_autocmd(%s)', string(name))
execute 'augroup END'
else else
call s:err('Invalid `on` option: '.cmd. call s:err('Invalid `on` option: '.cmd.
\ '. Should start with an uppercase letter or `<Plug>`.') \ '. Should start with an uppercase letter, `<Plug>`, or `#`.')
endif endif
endfor endfor
endif endif
@@ -263,7 +258,7 @@ function! plug#end()
for [cmd, names] in items(lod.cmd) for [cmd, names] in items(lod.cmd)
execute printf( execute printf(
\ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)', \ 'command! -nargs=* -range -bang %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
\ cmd, string(cmd), string(names)) \ cmd, string(cmd), string(names))
endfor endfor
@@ -324,7 +319,7 @@ endfunction
function! s:git_version_requirement(...) function! s:git_version_requirement(...)
if !exists('s:git_version') if !exists('s:git_version')
let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') let s:git_version = map(split(split(s:system('git --version'))[-1], '\.'), 'str2nr(v:val)')
endif endif
return s:version_requirement(s:git_version, a:000) return s:version_requirement(s:git_version, a:000)
endfunction endfunction
@@ -437,10 +432,7 @@ function! s:dobufread(names)
let path = s:rtp(g:plugs[name]).'/**' let path = s:rtp(g:plugs[name]).'/**'
for dir in ['ftdetect', 'ftplugin'] for dir in ['ftdetect', 'ftplugin']
if len(finddir(dir, path)) if len(finddir(dir, path))
if exists('#BufRead') return s:doautocmd('BufRead')
doautocmd BufRead
endif
return
endif endif
endfor endfor
endfor endfor
@@ -453,21 +445,14 @@ function! plug#load(...)
if !exists('g:plugs') if !exists('g:plugs')
return s:err('plug#begin was not called') return s:err('plug#begin was not called')
endif endif
let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 let unknowns = filter(copy(a:000), '!has_key(g:plugs, v:val)')
let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
if !empty(unknowns) if !empty(unknowns)
let s = len(unknowns) > 1 ? 's' : '' let s = len(unknowns) > 1 ? 's' : ''
return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
end end
let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') call s:lod(a:000, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
if !empty(unloaded) call s:dobufread(a:000)
for name in unloaded return 1
call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
endfor
call s:dobufread(unloaded)
return 1
end
return 0
endfunction endfunction
function! s:remove_triggers(name) function! s:remove_triggers(name)
@@ -546,6 +531,14 @@ function! s:lod_map(map, names, with_prefix, prefix)
call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra) call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
endfunction endfunction
function! s:lod_autocmd(name)
call s:lod([a:name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
call s:dobufread([a:name])
let group = 'Plug/'.a:name
execute 'autocmd!' group
execute 'augroup!' group
endfunction
function! plug#(repo, ...) function! plug#(repo, ...)
if a:0 > 1 if a:0 > 1
return s:err('Invalid number of arguments (1..2)') return s:err('Invalid number of arguments (1..2)')
@@ -591,7 +584,7 @@ function! s:infer_properties(name, repo)
let uri = repo let uri = repo
else else
if repo !~ '/' if repo !~ '/'
throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) let repo = 'vim-scripts/'. repo
endif endif
let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
let uri = printf(fmt, repo) let uri = printf(fmt, repo)
@@ -613,7 +606,7 @@ function! plug#helptags()
return s:err('plug#begin was not called') return s:err('plug#begin was not called')
endif endif
for spec in values(g:plugs) for spec in values(g:plugs)
let docd = join([s:rtp(spec), 'doc'], '/') let docd = join([spec.dir, 'doc'], '/')
if isdirectory(docd) if isdirectory(docd)
silent! execute 'helptags' s:esc(docd) silent! execute 'helptags' s:esc(docd)
endif endif
@@ -637,10 +630,10 @@ function! s:syntax()
syn match plugTag /(tag: [^)]\+)/ syn match plugTag /(tag: [^)]\+)/
syn match plugInstall /\(^+ \)\@<=[^:]*/ syn match plugInstall /\(^+ \)\@<=[^:]*/
syn match plugUpdate /\(^* \)\@<=[^:]*/ syn match plugUpdate /\(^* \)\@<=[^:]*/
syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag syn match plugCommit /^ \X*[0-9a-f]\{7} .*/ contains=plugRelDate,plugEdge,plugTag
syn match plugEdge /^ \X\+$/ syn match plugEdge /^ \X\+$/
syn match plugEdge /^ \X*/ contained nextgroup=plugSha syn match plugEdge /^ \X*/ contained nextgroup=plugSha
syn match plugSha /[0-9a-f]\{7,9}/ contained syn match plugSha /[0-9a-f]\{7}/ contained
syn match plugRelDate /([^)]*)$/ contained syn match plugRelDate /([^)]*)$/ contained
syn match plugNotLoaded /(not loaded)$/ syn match plugNotLoaded /(not loaded)$/
syn match plugError /^x.*/ syn match plugError /^x.*/
@@ -770,10 +763,7 @@ function! s:prepare(...)
for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd'] for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
execute 'silent! unmap <buffer>' k execute 'silent! unmap <buffer>' k
endfor endfor
setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable
if exists('+colorcolumn')
setlocal colorcolumn=
endif
setf vim-plug setf vim-plug
if exists('g:syntax_on') if exists('g:syntax_on')
call s:syntax() call s:syntax()
@@ -793,10 +783,8 @@ function! s:assign_name()
endfunction endfunction
function! s:chsh(swap) function! s:chsh(swap)
let prev = [&shell, &shellcmdflag, &shellredir] let prev = [&shell, &shellredir]
if s:is_win if !s:is_win && a:swap
set shell=cmd.exe shellcmdflag=/c shellredir=>%s\ 2>&1
elseif a:swap
set shell=sh shellredir=>%s\ 2>&1 set shell=sh shellredir=>%s\ 2>&1
endif endif
return prev return prev
@@ -804,23 +792,15 @@ endfunction
function! s:bang(cmd, ...) function! s:bang(cmd, ...)
try try
let [sh, shellcmdflag, shrd] = s:chsh(a:0) let [sh, shrd] = s:chsh(a:0)
" FIXME: Escaping is incomplete. We could use shellescape with eval, " FIXME: Escaping is incomplete. We could use shellescape with eval,
" but it won't work on Windows. " but it won't work on Windows.
let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
if s:is_win let g:_plug_bang = '!'.escape(cmd, '#!%')
let batchfile = tempname().'.bat'
call writefile(["@echo off\r", cmd . "\r"], batchfile)
let cmd = batchfile
endif
let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
execute "normal! :execute g:_plug_bang\<cr>\<cr>" execute "normal! :execute g:_plug_bang\<cr>\<cr>"
finally finally
unlet g:_plug_bang unlet g:_plug_bang
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] let [&shell, &shellredir] = [sh, shrd]
if s:is_win
call delete(batchfile)
endif
endtry endtry
return v:shell_error ? 'Exit status: ' . v:shell_error : '' return v:shell_error ? 'Exit status: ' . v:shell_error : ''
endfunction endfunction
@@ -849,10 +829,6 @@ function! s:do(pull, force, todo)
let type = type(spec.do) let type = type(spec.do)
if type == s:TYPE.string if type == s:TYPE.string
if spec.do[0] == ':' if spec.do[0] == ':'
if !get(s:loaded, name, 0)
let s:loaded[name] = 1
call s:reorg_rtp()
endif
call s:load_plugin(spec) call s:load_plugin(spec)
try try
execute spec.do[1:] execute spec.do[1:]
@@ -897,7 +873,7 @@ function! s:checkout(spec)
let output = s:system('git rev-parse HEAD', a:spec.dir) let output = s:system('git rev-parse HEAD', a:spec.dir)
if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) if !v:shell_error && !s:hash_match(sha, s:lines(output)[0])
let output = s:system( let output = s:system(
\ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) \ 'git fetch --depth 999999 && git checkout '.s:esc(sha), a:spec.dir)
endif endif
return output return output
endfunction endfunction
@@ -919,7 +895,7 @@ function! s:finish(pull)
call add(msgs, "Press 'R' to retry.") call add(msgs, "Press 'R' to retry.")
endif endif
if a:pull && len(s:update.new) < len(filter(getline(5, '$'), if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
\ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) \ "v:val =~ '^- ' && stridx(v:val, 'Already up-to-date') < 0"))
call add(msgs, "Press 'D' to see the updated changes.") call add(msgs, "Press 'D' to see the updated changes.")
endif endif
echo join(msgs, ' ') echo join(msgs, ' ')
@@ -955,8 +931,7 @@ function! s:check_ruby()
endfunction endfunction
function! s:update_impl(pull, force, args) abort function! s:update_impl(pull, force, args) abort
let sync = index(a:args, '--sync') >= 0 || has('vim_starting') let args = copy(a:args)
let args = filter(copy(a:args), 'v:val != "--sync"')
let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
\ remove(args, -1) : get(g:, 'plug_threads', 16) \ remove(args, -1) : get(g:, 'plug_threads', 16)
@@ -992,7 +967,7 @@ function! s:update_impl(pull, force, args) abort
let use_job = s:nvim || s:vim8 let use_job = s:nvim || s:vim8
let python = (has('python') || has('python3')) && !use_job let python = (has('python') || has('python3')) && !use_job
let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && s:check_ruby()
let s:update = { let s:update = {
\ 'start': reltime(), \ 'start': reltime(),
@@ -1015,12 +990,6 @@ function! s:update_impl(pull, force, args) abort
let s:clone_opt = get(g:, 'plug_shallow', 1) ? let s:clone_opt = get(g:, 'plug_shallow', 1) ?
\ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : ''
if has('win32unix')
let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input'
endif
let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
" Python version requirement (>= 2.7) " Python version requirement (>= 2.7)
if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
redir => pyv redir => pyv
@@ -1063,7 +1032,7 @@ function! s:update_impl(pull, force, args) abort
endtry endtry
else else
call s:update_vim() call s:update_vim()
while use_job && sync while use_job && has('vim_starting')
sleep 100m sleep 100m
if s:update.fin if s:update.fin
break break
@@ -1094,7 +1063,7 @@ function! s:update_finish()
elseif has_key(spec, 'tag') elseif has_key(spec, 'tag')
let tag = spec.tag let tag = spec.tag
if tag =~ '\*' if tag =~ '\*'
let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) let tags = s:lines(s:system('git tag --list '.string(tag).' --sort -version:refname 2>&1', spec.dir))
if !v:shell_error && !empty(tags) if !v:shell_error && !empty(tags)
let tag = tags[0] let tag = tags[0]
call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
@@ -1102,17 +1071,17 @@ function! s:update_finish()
endif endif
endif endif
call s:log4(name, 'Checking out '.tag) call s:log4(name, 'Checking out '.tag)
let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) let out = s:system('git checkout -q '.s:esc(tag).' 2>&1', spec.dir)
else else
let branch = s:esc(get(spec, 'branch', 'master')) let branch = s:esc(get(spec, 'branch', 'master'))
call s:log4(name, 'Merging origin/'.branch) call s:log4(name, 'Merging origin/'.branch)
let out = s:system('git checkout -q '.branch.' -- 2>&1' let out = s:system('git checkout -q '.branch.' 2>&1'
\. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir)
endif endif
if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
\ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
call s:log4(name, 'Updating submodules. This may take a while.') call s:log4(name, 'Updating submodules. This may take a while.')
let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) let out .= s:bang('git submodule update --init --recursive 2>&1', spec.dir)
endif endif
let msg = s:format_message(v:shell_error ? 'x': '-', name, out) let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
if v:shell_error if v:shell_error
@@ -1196,7 +1165,7 @@ function! s:job_cb(fn, job, ch, data)
call call(a:fn, [a:job, a:data]) call call(a:fn, [a:job, a:data])
endfunction endfunction
function! s:nvim_cb(job_id, data, event) dict abort function! s:nvim_cb(job_id, data, event) abort
return a:event == 'stdout' ? return a:event == 'stdout' ?
\ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
\ s:job_cb('s:job_exit_cb', self, 0, a:data) \ s:job_cb('s:job_exit_cb', self, 0, a:data)
@@ -1204,15 +1173,10 @@ endfunction
function! s:spawn(name, cmd, opts) function! s:spawn(name, cmd, opts)
let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
\ 'batchfile': (s:is_win && (s:nvim || s:vim8)) ? tempname().'.bat' : '',
\ 'new': get(a:opts, 'new', 0) } \ 'new': get(a:opts, 'new', 0) }
let s:jobs[a:name] = job let s:jobs[a:name] = job
let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'],
if !empty(job.batchfile) \ has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd)
call writefile(["@echo off\r", cmd . "\r"], job.batchfile)
let cmd = job.batchfile
endif
let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], cmd)
if s:nvim if s:nvim
call extend(job, { call extend(job, {
@@ -1229,7 +1193,7 @@ function! s:spawn(name, cmd, opts)
\ 'Invalid arguments (or job table is full)'] \ 'Invalid arguments (or job table is full)']
endif endif
elseif s:vim8 elseif s:vim8
let jid = job_start(s:is_win ? join(argv, ' ') : argv, { let jid = job_start(argv, {
\ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
\ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
\ 'out_mode': 'raw' \ 'out_mode': 'raw'
@@ -1242,7 +1206,8 @@ function! s:spawn(name, cmd, opts)
let job.lines = ['Failed to start job'] let job.lines = ['Failed to start job']
endif endif
else else
let job.lines = s:lines(call('s:system', [cmd])) let params = has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]
let job.lines = s:lines(call('s:system', params))
let job.error = v:shell_error != 0 let job.error = v:shell_error != 0
let job.running = 0 let job.running = 0
endif endif
@@ -1262,9 +1227,6 @@ function! s:reap(name)
call s:log(bullet, a:name, empty(result) ? 'OK' : result) call s:log(bullet, a:name, empty(result) ? 'OK' : result)
call s:bar() call s:bar()
if has_key(job, 'batchfile') && !empty(job.batchfile)
call delete(job.batchfile)
endif
call remove(s:jobs, a:name) call remove(s:jobs, a:name)
endfunction endfunction
@@ -1331,7 +1293,7 @@ while 1 " Without TCO, Vim stack is bound to explode
let name = keys(s:update.todo)[0] let name = keys(s:update.todo)[0]
let spec = remove(s:update.todo, name) let spec = remove(s:update.todo, name)
let new = empty(globpath(spec.dir, '.git', 1)) let new = !isdirectory(spec.dir)
call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
redraw redraw
@@ -1814,7 +1776,6 @@ function! s:update_ruby()
tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
nthr = VIM::evaluate('s:update.threads').to_i nthr = VIM::evaluate('s:update.threads').to_i
maxy = VIM::evaluate('winheight(".")').to_i maxy = VIM::evaluate('winheight(".")').to_i
vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
cd = iswin ? 'cd /d' : 'cd' cd = iswin ? 'cd /d' : 'cd'
tot = VIM::evaluate('len(s:update.todo)') || 0 tot = VIM::evaluate('len(s:update.todo)') || 0
bar = '' bar = ''
@@ -1904,17 +1865,11 @@ function! s:update_ruby()
main = Thread.current main = Thread.current
threads = [] threads = []
watcher = Thread.new { watcher = Thread.new {
if vim7 require 'io/console' # >= Ruby 1.9
while VIM::evaluate('getchar(1)') nil until IO.console.getch == 3.chr
sleep 0.1
end
else
require 'io/console' # >= Ruby 1.9
nil until IO.console.getch == 3.chr
end
mtx.synchronize do mtx.synchronize do
running = false running = false
threads.each { |t| t.raise Interrupt } unless vim7 threads.each { |t| t.raise Interrupt }
end end
threads.each { |t| t.join rescue nil } threads.each { |t| t.join rescue nil }
main.kill main.kill
@@ -1982,19 +1937,8 @@ function! s:update_ruby()
EOF EOF
endfunction endfunction
function! s:shellesc_cmd(arg)
let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g')
let escaped = substitute(escaped, '%', '%%', 'g')
let escaped = substitute(escaped, '"', '\\^&', 'g')
let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g')
return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"'
endfunction
function! s:shellesc(arg) function! s:shellesc(arg)
if &shell =~# 'cmd.exe$' return '"'.escape(a:arg, '"').'"'
return s:shellesc_cmd(a:arg)
endif
return shellescape(a:arg)
endfunction endfunction
function! s:glob_dir(path) function! s:glob_dir(path)
@@ -2032,19 +1976,11 @@ endfunction
function! s:system(cmd, ...) function! s:system(cmd, ...)
try try
let [sh, shellcmdflag, shrd] = s:chsh(1) let [sh, shrd] = s:chsh(1)
let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd
if s:is_win
let batchfile = tempname().'.bat'
call writefile(["@echo off\r", cmd . "\r"], batchfile)
let cmd = batchfile
endif
return system(s:is_win ? '('.cmd.')' : cmd) return system(s:is_win ? '('.cmd.')' : cmd)
finally finally
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] let [&shell, &shellredir] = [sh, shrd]
if s:is_win
call delete(batchfile)
endif
endtry endtry
endfunction endfunction
@@ -2079,7 +2015,7 @@ function! s:git_validate(spec, check_branch)
" Check tag " Check tag
if has_key(a:spec, 'tag') if has_key(a:spec, 'tag')
let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
if a:spec.tag !=# tag && a:spec.tag !~ '\*' if a:spec.tag !=# tag
let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
\ (empty(tag) ? 'N/A' : tag), a:spec.tag) \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
endif endif
@@ -2089,21 +2025,10 @@ function! s:git_validate(spec, check_branch)
\ branch, a:spec.branch) \ branch, a:spec.branch)
endif endif
if empty(err) if empty(err)
let [ahead, behind] = split(s:lastline(s:system(printf( let commits = len(s:lines(s:system(printf('git rev-list origin/%s..HEAD', a:spec.branch), a:spec.dir)))
\ 'git rev-list --count --left-right HEAD...origin/%s', if !v:shell_error && commits
\ a:spec.branch), a:spec.dir)), '\t') let err = join([printf('Diverged from origin/%s by %d commit(s).', a:spec.branch, commits),
if !v:shell_error && ahead \ 'Reinstall after PlugClean.'], "\n")
if behind
" Only mention PlugClean if diverged, otherwise it's likely to be
" pushable (and probably not that messed up).
let err = printf(
\ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
\ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind)
else
let err = printf("Ahead of origin/%s by %d commit(s).\n"
\ .'Cannot update until local changes are pushed.',
\ a:spec.branch, ahead)
endif
endif endif
endif endif
endif endif
@@ -2259,16 +2184,15 @@ function! s:status()
let unloaded = 0 let unloaded = 0
let [cnt, total] = [0, len(g:plugs)] let [cnt, total] = [0, len(g:plugs)]
for [name, spec] in items(g:plugs) for [name, spec] in items(g:plugs)
let is_dir = isdirectory(spec.dir)
if has_key(spec, 'uri') if has_key(spec, 'uri')
if is_dir if isdirectory(spec.dir)
let [err, _] = s:git_validate(spec, 1) let [err, _] = s:git_validate(spec, 1)
let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
else else
let [valid, msg] = [0, 'Not found. Try PlugInstall.'] let [valid, msg] = [0, 'Not found. Try PlugInstall.']
endif endif
else else
if is_dir if isdirectory(spec.dir)
let [valid, msg] = [1, 'OK'] let [valid, msg] = [1, 'OK']
else else
let [valid, msg] = [0, 'Not found.'] let [valid, msg] = [0, 'Not found.']
@@ -2277,7 +2201,7 @@ function! s:status()
let cnt += 1 let cnt += 1
let ecnt += !valid let ecnt += !valid
" `s:loaded` entry can be missing if PlugUpgraded " `s:loaded` entry can be missing if PlugUpgraded
if is_dir && get(s:loaded, name, -1) == 0 if valid && get(s:loaded, name, -1) == 0
let unloaded = 1 let unloaded = 1
let msg .= ' (not loaded)' let msg .= ' (not loaded)'
endif endif
@@ -2347,7 +2271,7 @@ function! s:preview_commit()
let b:plug_preview = !s:is_preview_window_open() let b:plug_preview = !s:is_preview_window_open()
endif endif
let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7}')
if empty(sha) if empty(sha)
return return
endif endif
@@ -2365,21 +2289,7 @@ function! s:preview_commit()
wincmd P wincmd P
endif endif
setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable
try execute 'silent %!cd' s:shellesc(g:plugs[name].dir) '&& git show --no-color --pretty=medium' sha
let [sh, shellcmdflag, shrd] = s:chsh(1)
let cmd = 'cd '.s:shellesc(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
if s:is_win
let batchfile = tempname().'.bat'
call writefile(["@echo off\r", cmd . "\r"], batchfile)
let cmd = batchfile
endif
execute 'silent %!' cmd
finally
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
if s:is_win
call delete(batchfile)
endif
endtry
setlocal nomodifiable setlocal nomodifiable
nnoremap <silent> <buffer> q :q<cr> nnoremap <silent> <buffer> q :q<cr>
wincmd p wincmd p
@@ -2420,7 +2330,7 @@ function! s:diff()
call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
for [k, v] in plugs for [k, v] in plugs
let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..'
let diff = s:system_chomp('git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 's:shellesc(v:val)')), v.dir) let diff = s:system_chomp('git log --graph --color=never --pretty=format:"%x01%h%x01%d%x01%s%x01%cr" '.s:shellesc(range), v.dir)
if !empty(diff) if !empty(diff)
let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
@@ -2439,13 +2349,8 @@ function! s:diff()
\ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
if cnts[0] || cnts[1] if cnts[0] || cnts[1]
nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr> nnoremap <silent> <buffer> <cr> :silent! call <SID>preview_commit()<cr>
if empty(maparg("\<cr>", 'n')) nnoremap <silent> <buffer> o :silent! call <SID>preview_commit()<cr>
nmap <buffer> <cr> <plug>(plug-preview)
endif
if empty(maparg('o', 'n'))
nmap <buffer> o <plug>(plug-preview)
endif
endif endif
if cnts[0] if cnts[0]
nnoremap <silent> <buffer> X :call <SID>revert()<cr> nnoremap <silent> <buffer> X :call <SID>revert()<cr>
@@ -2466,7 +2371,7 @@ function! s:revert()
return return
endif endif
call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch), g:plugs[name].dir)
setlocal modifiable setlocal modifiable
normal! "_dap normal! "_dap
setlocal nomodifiable setlocal nomodifiable

View File

@@ -1,6 +1,5 @@
********************************************************************** **********************************************************************
Execute (#112 On-demand loading should not suppress messages from ftplugin): Execute (#112 On-demand loading should not suppress messages from ftplugin):
call ResetPlug()
call plug#begin('$PLUG_FIXTURES') call plug#begin('$PLUG_FIXTURES')
Plug '$PLUG_FIXTURES/ftplugin-msg', { 'for': 'c' } Plug '$PLUG_FIXTURES/ftplugin-msg', { 'for': 'c' }
call plug#end() call plug#end()
@@ -8,14 +7,13 @@ Execute (#112 On-demand loading should not suppress messages from ftplugin):
redir => out redir => out
tabnew a.c tabnew a.c
redir END redir END
Assert stridx(out, 'ftplugin-c') >= 0, 'Unexpected output (1): '.out Assert stridx(out, 'ftplugin-c') >= 0
* The same applies to plug#load()) * The same applies to plug#load())
call ResetPlug()
redir => out redir => out
call plug#load('ftplugin-msg') call plug#load('ftplugin-msg')
redir END redir END
Assert stridx(out, 'ftplugin-c') >= 0, 'Unexpected output (2): '.out Assert stridx(out, 'ftplugin-c') >= 0
q q
@@ -41,7 +39,6 @@ Execute (#130 Proper cleanup of on-demand loading triggers):
Plug 'junegunn/vim-emoji', { 'on': ['EmojiCommand', 'EmojiCommand2', '<Plug>(EmojiMapping)'] } Plug 'junegunn/vim-emoji', { 'on': ['EmojiCommand', 'EmojiCommand2', '<Plug>(EmojiMapping)'] }
call plug#end() call plug#end()
PlugInstall | q PlugInstall | q
call mkdir(g:plugs['vim-emoji'].dir.'/after/plugin', 'p')
Assert exists(':EmojiCommand'), 'EmojiCommand not defined' Assert exists(':EmojiCommand'), 'EmojiCommand not defined'
Assert exists(':EmojiCommand2'), 'EmojiCommand2 not defined' Assert exists(':EmojiCommand2'), 'EmojiCommand2 not defined'
@@ -92,11 +89,10 @@ Execute (#139-1 Using new remote branch):
PlugUpdate PlugUpdate
unlet! g:foo g:bar g:baz unlet! g:foo g:bar g:baz
call ResetPlug()
call plug#load('new-branch') call plug#load('new-branch')
Assert exists('g:foo'), 'g:foo should be found (1)' Assert exists('g:foo'), 'g:foo should be found'
Assert !exists('g:bar'), 'g:bar should not be found (1)' Assert !exists('g:bar'), 'g:bar should not be found'
Assert !exists('g:baz'), 'g:baz should not be found (1)' Assert !exists('g:baz'), 'g:baz should not be found'
" Create a new branch on origin " Create a new branch on origin
call system('cd /tmp/vim-plug-test/new-branch && git checkout -b new &&' call system('cd /tmp/vim-plug-test/new-branch && git checkout -b new &&'
@@ -114,11 +110,10 @@ Execute (#139-1 Using new remote branch):
Assert @" !~? 'error', 'Should be able to use new remote branch: ' . @" Assert @" !~? 'error', 'Should be able to use new remote branch: ' . @"
unlet! g:foo g:bar g:baz unlet! g:foo g:bar g:baz
call ResetPlug()
call plug#load('new-branch') call plug#load('new-branch')
Assert exists('g:foo'), 'g:foo should be found (2)' Assert exists('g:foo'), 'g:foo should be found'
Assert exists('g:bar'), 'g:bar should be found (2)' Assert exists('g:bar'), 'g:bar should be found'
Assert !exists('g:baz'), 'g:baz should not be found (2)' Assert !exists('g:baz'), 'g:baz should not be found'
call PlugStatusSorted() call PlugStatusSorted()
@@ -145,7 +140,6 @@ Execute (#139-2 Using yet another new remote branch):
Assert @" !~? 'error', 'Should be able to use new remote branch: ' . @" Assert @" !~? 'error', 'Should be able to use new remote branch: ' . @"
unlet! g:foo g:bar g:baz unlet! g:foo g:bar g:baz
call ResetPlug()
call plug#load('new-branch') call plug#load('new-branch')
Assert exists('g:foo'), 'g:foo should be found' Assert exists('g:foo'), 'g:foo should be found'
Assert !exists('g:bar'), 'g:bar should not be found' Assert !exists('g:bar'), 'g:bar should not be found'
@@ -231,7 +225,7 @@ Execute (#159: shell=/bin/tcsh):
********************************************************************** **********************************************************************
Execute (#154: Spaces in &rtp should not be escaped): Execute (#154: Spaces in &rtp should not be escaped):
call plug#begin('/tmp/vim-plug-test/plug it') call plug#begin('/tmp/vim-plug-test/plug it')
Plug 'foo/seoul256 vim' Plug 'seoul256 vim'
call plug#end() call plug#end()
Log &rtp Log &rtp
Assert stridx(&rtp, 'plug it/seoul256 vim') >= 0 Assert stridx(&rtp, 'plug it/seoul256 vim') >= 0
@@ -239,12 +233,12 @@ Execute (#154: Spaces in &rtp should not be escaped):
********************************************************************** **********************************************************************
Execute (#184: Duplicate entries in &rtp): Execute (#184: Duplicate entries in &rtp):
call plug#begin('/tmp/vim-plug-test/plugged') call plug#begin('/tmp/vim-plug-test/plugged')
Plug 'foo/plugin1' Plug 'plugin1'
\| Plug 'foo/plugin0' \| Plug 'plugin0'
Plug 'foo/plugin2' Plug 'plugin2'
\| Plug 'foo/plugin0' \| Plug 'plugin0'
\| Plug 'foo/plugin1' \| Plug 'plugin1'
call plug#end() call plug#end()
Log &rtp Log &rtp
@@ -310,19 +304,17 @@ Execute (#474: Load ftdetect files in filetypedetect augroup):
bd bd
********************************************************************** **********************************************************************
Execute (#489/#587 On-demand loading with 'on' option should trigger BufRead autocmd w/o nomodeline): Execute (#489 On-demand loading with 'on' option should trigger BufRead autocmd):
call plug#begin('$PLUG_FIXTURES') call plug#begin('$PLUG_FIXTURES')
Plug 'foo/ftplugin-msg', { 'on': 'XXX' } Plug 'ftplugin-msg', { 'on': 'XXX' }
call plug#end() call plug#end()
tabnew a.java tabnew a.java
call setline(1, '// vim: set filetype=lava:')
redir => out redir => out
silent! XXX silent! XXX
redir END redir END
Assert stridx(out, 'ftplugin-java') >= 0 Assert stridx(out, 'ftplugin-java') >= 0
AssertEqual 'lava', &filetype q
q!
********************************************************************** **********************************************************************
Execute (Cursor moved to another window during post-update hook): Execute (Cursor moved to another window during post-update hook):
@@ -338,38 +330,3 @@ Execute (Cursor moved to another window during post-update hook):
AssertEqual 'empty', getline(1) AssertEqual 'empty', getline(1)
q! q!
q q
**********************************************************************
Execute (#593 Add plugin to &rtp before running post-update hook with : prefix):
call ReloadPlug()
call plug#begin()
Plug 'junegunn/vim-pseudocl', { 'on': 'XXX', 'do': ':let g:bar = pseudocl#complete#extract_words(''a b'')' }
call plug#end()
PlugInstall!
AssertEqual ['a', 'b'], g:bar
**********************************************************************
Execute (#602 Confusion with branch name and path name):
call plug#begin()
Plug expand('file:////tmp/vim-plug-test/new-branch'), { 'branch': 'plugin' }
call plug#end()
PlugUpdate
call PlugStatusSorted()
Expect:
- new-branch: OK
Finished. 0 error(s).
[=]
**********************************************************************
Execute (PlugStatus showed error with wildcard tag):
call plug#begin()
Plug 'junegunn/vim-easy-align', { 'tag': '*' }
call plug#end()
PlugUpdate
call PlugStatusSorted()
Expect:
- vim-easy-align: OK
Finished. 0 error(s).
[=]

View File

@@ -1,10 +1,6 @@
#!/bin/bash #!/bin/bash
# Privileged mode, ignores $CDPATH etc. cd $(dirname "${BASH_SOURCE[0]}")
set -p
set -eu
cd "$(dirname "${BASH_SOURCE[0]}")"
export BASE="$PWD" export BASE="$PWD"
export PLUG_SRC="$PWD/../plug.vim" export PLUG_SRC="$PWD/../plug.vim"
@@ -20,8 +16,8 @@ set shell=/bin/bash
VIMRC VIMRC
clone() { clone() {
if [ ! -d "$2" ]; then if [ ! -d $2 ]; then
git clone "$1" "$2" git clone $1 $2
fi fi
} }
@@ -48,8 +44,8 @@ make_dirs() (
cd "$PLUG_FIXTURES/$1" cd "$PLUG_FIXTURES/$1"
mkdir -p autoload colors ftdetect ftplugin indent plugin syntax mkdir -p autoload colors ftdetect ftplugin indent plugin syntax
for d in *; do for d in *; do
[ -d "$d" ] || continue [ -d $d ] || continue
cat > "$d/xxx.vim" << EOF cat > $d/xxx.vim << EOF
" echom expand('<sfile>') " echom expand('<sfile>')
let g:total_order = get(g:, 'total_order', []) let g:total_order = get(g:, 'total_order', [])
let g:$2 = get(g:, '$2', []) let g:$2 = get(g:, '$2', [])
@@ -77,17 +73,13 @@ DOC
make_dirs yyy/ yyy make_dirs yyy/ yyy
make_dirs yyy/after yyy make_dirs yyy/after yyy
mkdir -p "$PLUG_FIXTURES/yyy/rtp/doc"
cat > "$PLUG_FIXTURES/yyy/rtp/doc/yyy.txt" << DOC
hello *yyy*
DOC
gitinit yyy gitinit yyy
make_dirs z1/ z1 make_dirs z1/ z1
make_dirs z2/ z2 make_dirs z2/ z2
rm -rf "$PLUG_FIXTURES/ftplugin-msg" rm -rf "$PLUG_FIXTURES/ftplugin-msg"
mkdir -p "$PLUG_FIXTURES"/ftplugin-msg/{plugin,ftplugin} mkdir -p "$PLUG_FIXTURES/ftplugin-msg/ftplugin"
echo "echomsg 'ftplugin-c'" > "$PLUG_FIXTURES/ftplugin-msg/ftplugin/c.vim" echo "echomsg 'ftplugin-c'" > "$PLUG_FIXTURES/ftplugin-msg/ftplugin/c.vim"
echo "echomsg 'ftplugin-java'" > "$PLUG_FIXTURES/ftplugin-msg/ftplugin/java.vim" echo "echomsg 'ftplugin-java'" > "$PLUG_FIXTURES/ftplugin-msg/ftplugin/java.vim"
@@ -99,15 +91,13 @@ DOC
echo 'let g:foo = 1' > plugin/foo.vim echo 'let g:foo = 1' > plugin/foo.vim
git add plugin/foo.vim git add plugin/foo.vim
git commit -m initial git commit -m initial
git checkout -b plugin
git checkout master
cd "$BASE" cd "$BASE"
} }
select_vim() { select_vim() {
local vim=/usr/bin/vim local vim=/usr/bin/vim
if [ -n "${DEPS:-}" ] && [ -e "${DEPS}/bin/vim" ]; then if [ -n "$DEPS" ] && [ -e "${DEPS}/bin/vim" ]; then
vim="${DEPS}/bin/vim" vim="${DEPS}/bin/vim"
elif [ -e "/usr/local/bin/vim" ]; then elif [ -e "/usr/local/bin/vim" ]; then
vim=/usr/local/bin/vim vim=/usr/local/bin/vim
@@ -119,12 +109,13 @@ clone_repos
prepare prepare
git --version git --version
vim=$(select_vim) VIM=$(select_vim)
echo "Selected Vim: $vim" echo "Selected Vim: $VIM"
if [ "${1:-}" = '!' ]; then if [ "$1" = '!' ]; then
$vim -Nu $TEMP/mini-vimrc -c 'Vader! test.vader' > /dev/null && $VIM -Nu $TEMP/mini-vimrc -c 'Vader! test.vader' > /dev/null &&
prepare && prepare &&
$vim -Nu $TEMP/mini-vimrc -c 'let g:plug_threads = 1 | Vader! test.vader' > /dev/null $VIM -Nu $TEMP/mini-vimrc -c 'let g:plug_threads = 1 | Vader! test.vader' > /dev/null
else else
$vim -Nu $TEMP/mini-vimrc -c 'Vader test.vader' $VIM -Nu $TEMP/mini-vimrc -c 'Vader test.vader'
fi fi

View File

@@ -37,10 +37,9 @@ Execute (Initialize test environment):
g/^$/d g/^$/d
endfunction endfunction
function! AssertExpect(bang, pat, cnt, ...) function! AssertExpect(bang, pat, cnt)
let op = a:bang ? '==#' : '=~#' let op = a:bang ? '==#' : '=~#'
let args = [a:cnt, len(filter(getline(1, '$'), "v:val ".op." '".a:pat."'"))] + a:000 AssertEqual a:cnt, len(filter(getline(1, '$'), "v:val ".op." '".a:pat."'"))
call call('vader#assert#equal', args)
endfunction endfunction
command! -nargs=+ -bang AssertExpect call AssertExpect('<bang>' == '!', <args>) command! -nargs=+ -bang AssertExpect call AssertExpect('<bang>' == '!', <args>)

View File

@@ -19,13 +19,6 @@ Execute (plug#begin() without path argument with empty &rtp):
let &rtp = save_rtp let &rtp = save_rtp
unlet save_rtp unlet save_rtp
Execute (Standard runtime path is not allowed):
redir => out
silent! AssertEqual 0, plug#begin(split(&rtp, ',')[0].'/plugin')
redir END
Log out
Assert stridx(out, 'Invalid plug home') >= 0
Execute (plug#begin(path)): Execute (plug#begin(path)):
call plug#begin(g:temp_plugged.'/') call plug#begin(g:temp_plugged.'/')
Assert g:plug_home !~ '[/\\]$', 'Trailing / should be stripped from g:plug_home' Assert g:plug_home !~ '[/\\]$', 'Trailing / should be stripped from g:plug_home'
@@ -64,17 +57,12 @@ Execute (Test Plug command):
AssertEqual join([g:temp_plugged, 'vim-emoji/'], '/'), g:plugs['vim-emoji'].dir AssertEqual join([g:temp_plugged, 'vim-emoji/'], '/'), g:plugs['vim-emoji'].dir
" vim-scripts/ " vim-scripts/
Plug 'vim-scripts/beauty256' Plug 'beauty256'
AssertEqual 'file:///tmp/vim-plug-test/vim-scripts/beauty256', g:plugs.beauty256.uri AssertEqual 'file:///tmp/vim-plug-test/vim-scripts/beauty256', g:plugs.beauty256.uri
AssertEqual 'master', g:plugs.beauty256.branch AssertEqual 'master', g:plugs.beauty256.branch
AssertEqual 4, len(g:plugs) AssertEqual 4, len(g:plugs)
redir => out
Plug 'beauty256'
redir END
Assert out =~ 'Invalid argument: beauty256'
Execute (Plug command with dictionary option): Execute (Plug command with dictionary option):
Log string(g:plugs) Log string(g:plugs)
Plug 'junegunn/seoul256.vim', { 'branch': 'no-t_co', 'rtp': '././' } Plug 'junegunn/seoul256.vim', { 'branch': 'no-t_co', 'rtp': '././' }
@@ -224,7 +212,7 @@ Expect:
[==] [==]
x seoul256.vim: x seoul256.vim:
Execute (Corrected the URI but ahead of upstream): Execute (Corrected the URI but diverged from master):
call plug#begin() call plug#begin()
Plug 'junegunn/seoul256.vim' Plug 'junegunn/seoul256.vim'
Plug 'file:///tmp/vim-plug-test/jg/vim-emoji' Plug 'file:///tmp/vim-plug-test/jg/vim-emoji'
@@ -235,8 +223,8 @@ Execute (Corrected the URI but ahead of upstream):
call PlugStatusSorted() call PlugStatusSorted()
Expect: Expect:
Ahead of origin/master by 3 commit(s). Diverged from origin/master by 3 commit(s).
Cannot update until local changes are pushed. Reinstall after PlugClean.
- vim-emoji: OK - vim-emoji: OK
Finished. 1 error(s). Finished. 1 error(s).
[==] [==]
@@ -249,44 +237,11 @@ Expect:
# q # q
# PGdd # PGdd
Execute (PlugClean! keeps seoul256.vim): Execute (PlugClean! to remove seoul256.vim):
PlugClean! PlugClean!
" Two removed, emoji and seoul256 left " Three removed, emoji left
AssertEqual 'Removed 2 directories.', getline(4) AssertEqual 'Removed 3 directories.', getline(4)
AssertExpect '^\~ ', 2 AssertExpect '^\~ ', 3
AssertExpect 'Diverged', 0
Assert !empty(globpath(&rtp, 'colors/seoul256.vim'))
Assert !empty(globpath(&rtp, 'autoload/emoji.vim'))
q
Execute (Make seoul256 to be diverged):
call plug#begin()
Plug 'junegunn/seoul256.vim'
Plug 'file:///tmp/vim-plug-test/jg/vim-emoji'
call plug#end()
call system(printf(join([
\ 'cd "%s"',
\ 'git fetch --unshallow',
\ 'git reset "@{u}~1"',
\ 'git commit --allow-empty -m "diverged1"',
\ 'git commit --allow-empty -m "diverged2"'], ' && '),
\ g:plugs['seoul256.vim'].dir))
Assert empty(v:shell_error), 'Got shell error: '.v:shell_error
call PlugStatusSorted()
Expect:
Backup local changes and run PlugClean and PlugUpdate to reinstall it.
Diverged from origin/master (2 commit(s) ahead and 1 commit(s) behind!
- vim-emoji: OK
Finished. 1 error(s).
[==]
x seoul256.vim:
Execute (PlugClean! removes seoul256.vim):
PlugClean!
" One removed, emoji left
AssertEqual 'Removed 1 directories.', getline(4)
AssertExpect '^\~ ', 1
AssertExpect 'Diverged', 1 AssertExpect 'Diverged', 1
Assert empty(globpath(&rtp, 'colors/seoul256.vim')) Assert empty(globpath(&rtp, 'colors/seoul256.vim'))
Assert !empty(globpath(&rtp, 'autoload/emoji.vim')) Assert !empty(globpath(&rtp, 'autoload/emoji.vim'))
@@ -315,8 +270,8 @@ Execute (PlugClean! to remove vim-emoji):
PlugClean! PlugClean!
AssertExpect '^\~ ', 1 AssertExpect '^\~ ', 1
AssertEqual 'Removed 1 directories.', getline(4) AssertEqual 'Removed 1 directories.', getline(4)
Assert empty(globpath(&rtp, 'colors/seoul256.vim')), 'seoul256.vim was removed' Assert empty(globpath(&rtp, 'colors/seoul256.vim'))
Assert empty(globpath(&rtp, 'autoload/emoji.vim')), 'emoji was removed' Assert empty(globpath(&rtp, 'autoload/emoji.vim'))
q q
Execute (PlugUpdate to install both again): Execute (PlugUpdate to install both again):
@@ -328,7 +283,7 @@ Execute (PlugUpdate to install both again):
Execute (PlugUpdate only to find out plugins are up-to-date, D key to check): Execute (PlugUpdate only to find out plugins are up-to-date, D key to check):
PlugUpdate PlugUpdate
AssertExpect 'Already up.to.date', 2, 'Expected 2 times "Already up-to-date", but got: '.string(getline(1, '$')) AssertExpect 'Already up-to-date', 2
normal D normal D
AssertEqual '0 plugin(s) updated.', getline(1) AssertEqual '0 plugin(s) updated.', getline(1)
q q
@@ -370,15 +325,8 @@ Execute (New commits on remote, PlugUpdate, then PlugDiff):
AssertEqual 1, &previewwindow AssertEqual 1, &previewwindow
AssertEqual 'git', &filetype AssertEqual 'git', &filetype
" Close preview window " Back to plug window
pclose wincmd p
" Open and go to preview window with a custom mapping
nmap <buffer> <c-o> <plug>(plug-preview)<c-w>P
execute "normal \<c-o>"
AssertEqual 1, &previewwindow, 'Should be on preview window'
normal q
AssertEqual 0, &previewwindow, 'Should not be on preview window'
" ]] motion " ]] motion
execute 'normal $]]' execute 'normal $]]'
@@ -433,27 +381,6 @@ Execute (Test g:plug_pwindow):
normal q normal q
unlet g:plug_pwindow unlet g:plug_pwindow
Execute (#572 - Commit preview should work with non-POSIX-compliant &shell):
" Invalid shell
let shell = &shell
set shell=shellfish
try
" Preview commit should still work
PlugDiff
execute "normal ]]jo"
wincmd P
Log getline(1, '$')
Assert getline(1) =~ 'commit', 'Preview window is empty'
AssertEqual 'shellfish', &shell
finally
" Restore &shell
let &shell = shell
unlet shell
pclose
q
endtry
Execute (Reuse Plug window in another tab): Execute (Reuse Plug window in another tab):
let tabnr = tabpagenr() let tabnr = tabpagenr()
PlugDiff PlugDiff
@@ -544,7 +471,7 @@ Execute (PlugDiff):
Execute (Trying to execute on-demand commands when plugin is not installed): Execute (Trying to execute on-demand commands when plugin is not installed):
call ReloadPlug() call ReloadPlug()
call plug#begin() call plug#begin()
Plug 'junegunn/vim-easy-align', { 'on': ['EasyAlign', 'LiveEasyAlign!'] } Plug 'junegunn/vim-easy-align', { 'on': ['EasyAlign', 'LiveEasyAlign'] }
call plug#end() call plug#end()
Assert exists(':EasyAlign') Assert exists(':EasyAlign')
@@ -1137,28 +1064,16 @@ Before:
********************************************************************** **********************************************************************
Execute (plug#helptags): Execute (plug#helptags):
call plug#begin()
Plug '$PLUG_FIXTURES/xxx'
Plug '$PLUG_FIXTURES/yyy', { 'rtp': 'rtp' }
call plug#end()
silent! call delete(expand('$PLUG_FIXTURES/xxx/doc/tags')) silent! call delete(expand('$PLUG_FIXTURES/xxx/doc/tags'))
silent! call delete(expand('$PLUG_FIXTURES/yyy/rtp/doc/tags'))
Assert !filereadable(expand('$PLUG_FIXTURES/xxx/doc/tags')) Assert !filereadable(expand('$PLUG_FIXTURES/xxx/doc/tags'))
Assert !filereadable(expand('$PLUG_FIXTURES/yyy/rtp/doc/tags'))
AssertEqual 1, plug#helptags() AssertEqual 1, plug#helptags()
Assert filereadable(expand('$PLUG_FIXTURES/xxx/doc/tags')) Assert filereadable(expand('$PLUG_FIXTURES/xxx/doc/tags'))
Assert filereadable(expand('$PLUG_FIXTURES/yyy/rtp/doc/tags'))
********************************************************************** **********************************************************************
~ Manual loading ~ Manual loading
********************************************************************** **********************************************************************
Execute (plug#load - invalid arguments): Execute (plug#load - invalid arguments):
call ResetPlug()
call plug#begin()
Plug '$PLUG_FIXTURES/xxx', { 'for': 'xxx' }
Plug '$PLUG_FIXTURES/yyy', { 'for': 'yyy' }
call plug#end()
AssertEqual 0, plug#load() AssertEqual 0, plug#load()
AssertEqual 0, plug#load('non-existent-plugin') AssertEqual 0, plug#load('non-existent-plugin')
AssertEqual 0, plug#load('non-existent-plugin', 'another-non-existent-plugin') AssertEqual 0, plug#load('non-existent-plugin', 'another-non-existent-plugin')
@@ -1166,12 +1081,6 @@ Execute (plug#load - invalid arguments):
AssertEqual 0, plug#load('xxx', 'non-existent-plugin') AssertEqual 0, plug#load('xxx', 'non-existent-plugin')
AssertEqual 0, plug#load('non-existent-plugin', 'xxx') AssertEqual 0, plug#load('non-existent-plugin', 'xxx')
Execute (plug#load - list argument (#638)):
redir => out
call plug#load(keys(g:plugs))
redir END
AssertEqual '', out
Execute (on: []): Execute (on: []):
call plug#begin() call plug#begin()
Plug 'junegunn/rust.vim', { 'on': [] } Plug 'junegunn/rust.vim', { 'on': [] }
@@ -1266,7 +1175,7 @@ Execute (Using g:plug_url_format):
let g:plug_url_format = 'git@bitbucket.org:%s.git' let g:plug_url_format = 'git@bitbucket.org:%s.git'
Plug 'junegunn/seoul256.vim' Plug 'junegunn/seoul256.vim'
let g:plug_url_format = 'git@bitsocket.org:%s.git' let g:plug_url_format = 'git@bitsocket.org:%s.git'
Plug 'vim-scripts/beauty256' Plug 'beauty256'
AssertEqual 'git@bitbucket.org:junegunn/seoul256.vim.git', g:plugs['seoul256.vim'].uri AssertEqual 'git@bitbucket.org:junegunn/seoul256.vim.git', g:plugs['seoul256.vim'].uri
AssertEqual 'git@bitsocket.org:vim-scripts/beauty256.git', g:plugs['beauty256'].uri AssertEqual 'git@bitsocket.org:vim-scripts/beauty256.git', g:plugs['beauty256'].uri
let g:plug_url_format = prev_plug_url_format let g:plug_url_format = prev_plug_url_format
@@ -1510,8 +1419,8 @@ Execute (Commit hash support):
PlugUpdate PlugUpdate
Log getline(1, '$') Log getline(1, '$')
AssertEqual 'x goyo.vim:', getline(5) AssertEqual 'x goyo.vim:', getline(5)
AssertEqual ' fatal: invalid reference: ffffffff', getline(6) AssertEqual ' error: pathspec ''ffffffff'' did not match any file(s) known to git.', getline(6)
AssertEqual 0, stridx(getline(7), '- vim-emoji: HEAD is now at 9db7fcf') AssertEqual 0, stridx(getline(7), '- vim-emoji: HEAD is now at 9db7fcf...')
let hash = system(printf('cd %s && git rev-parse HEAD', g:plugs['vim-emoji'].dir))[:-2] let hash = system(printf('cd %s && git rev-parse HEAD', g:plugs['vim-emoji'].dir))[:-2]
AssertEqual '9db7fcfee0d90dafdbcb7a32090c0a9085eb054a', hash AssertEqual '9db7fcfee0d90dafdbcb7a32090c0a9085eb054a', hash
@@ -1620,33 +1529,21 @@ Execute (#532 - Reuse plug window):
call system(printf('cd "%s" && git commit --allow-empty -m "dummy"', g:plugs['goyo.vim'].dir)) call system(printf('cd "%s" && git commit --allow-empty -m "dummy"', g:plugs['goyo.vim'].dir))
PlugDiff PlugDiff
AssertEqual 1, winnr(), 'Current window is #1 after PlugDiff (but is '.winnr().')' AssertEqual 1, winnr()
AssertEqual 2, winnr('$'), 'Two windows after PlugDiff (but got '.winnr('$').')' AssertEqual 2, winnr('$')
" Open preview window " Open preview window
execute "normal ]]jo" execute "normal ]]jo"
AssertEqual 2, winnr(), 'Current window is #2 after opening preview (but is '.winnr().')' AssertEqual 2, winnr()
AssertEqual 3, winnr('$'), 'Three windows with preview (but got '.winnr('$').')' AssertEqual 3, winnr('$')
" Move plug window to the right " Move plug window to the right
wincmd L wincmd L
AssertEqual 3, winnr(), 'Current window is #3 after moving window (but is '.winnr().')' AssertEqual 3, winnr()
AssertEqual 3, winnr('$'), 'Three windows after moving window (but got '.winnr('$').')' AssertEqual 3, winnr('$')
" Reuse plug window. Preview window is closed. " Reuse plug window. Preview window is closed.
PlugStatus PlugStatus
AssertEqual 2, winnr(), 'Current window is #2 after PlugStatus (but is '.winnr().')' AssertEqual 2, winnr()
AssertEqual 2, winnr('$'), 'Three windows after PlugStatus (but got '.winnr('$').')' AssertEqual 2, winnr('$')
q q
Execute (#766 - Allow cloning into an empty directory):
let d = '/tmp/vim-plug-test/goyo-already'
call system('rm -rf ' . d)
call mkdir(d)
call plug#begin()
Plug 'junegunn/goyo.vim', { 'dir': d }
call plug#end()
PlugInstall
AssertExpect! '[=]', 1
q
unlet d