mirror of
https://github.com/junegunn/vim-plug.git
synced 2025-12-10 10:51:50 +08:00
Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e300178a0e | ||
|
|
f085751ca1 | ||
|
|
68488fd7a3 | ||
|
|
93a115718f | ||
|
|
c9971346bb | ||
|
|
66e038d443 | ||
|
|
fc2813ef44 | ||
|
|
cffcfe150b | ||
|
|
8b45742540 | ||
|
|
5430b6213a | ||
|
|
2f4e28161e | ||
|
|
ab940f624a | ||
|
|
c44422460e | ||
|
|
d16273e072 | ||
|
|
b17f477585 | ||
|
|
4a3e85e878 | ||
|
|
a9bf5bd722 | ||
|
|
e8892a9bef | ||
|
|
49be3a8ca9 | ||
|
|
95ef5e8d5f | ||
|
|
6fa6475fee | ||
|
|
588467903b | ||
|
|
5706f70f8f | ||
|
|
4a3c5e7ac2 | ||
|
|
d53d5a976f | ||
|
|
13ea184015 | ||
|
|
457bebcd30 | ||
|
|
b2133cf2ec | ||
|
|
c319036396 | ||
|
|
3aa3b5a4e8 | ||
|
|
01aab60ade | ||
|
|
6583b99032 | ||
|
|
71c41fccf5 | ||
|
|
8846bc6af1 | ||
|
|
0862a76fdd | ||
|
|
54d837fa54 | ||
|
|
e718868e85 | ||
|
|
668bc0fd2a | ||
|
|
c3b6b7c297 | ||
|
|
2f5f74e5e6 | ||
|
|
b2aa5724c0 | ||
|
|
359ce90b9b | ||
|
|
e6ed2e5658 | ||
|
|
897ce5e2fa | ||
|
|
d2f8ca2dbc | ||
|
|
93b702512d | ||
|
|
68fef9c2fd | ||
|
|
eee50c55bf | ||
|
|
96046c01c3 | ||
|
|
fcfd5b7e1f | ||
|
|
849b76be90 | ||
|
|
ff97806e50 | ||
|
|
68b31a4a66 | ||
|
|
46f843aafe | ||
|
|
ebd534c88b | ||
|
|
3b29e1e6e2 | ||
|
|
307b0f244d | ||
|
|
8a44109329 | ||
|
|
0b32d2d23e | ||
|
|
226d6abeb2 | ||
|
|
fddbcb8f1a | ||
|
|
f1ad2d864a | ||
|
|
08e78d8a5e | ||
|
|
518a3566c3 | ||
|
|
d1c19a6fa9 | ||
|
|
734d9a11b5 |
52
.github/workflows/test.yml
vendored
Normal file
52
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
name: Test vim-plug
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master, devel]
|
||||||
|
pull_request:
|
||||||
|
branches: [master]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
vim:
|
||||||
|
- vim
|
||||||
|
# FIXME: (core dumped) https://github.com/junegunn/vim-plug/runs/4422576984?check_suite_focus=true#step:3:238
|
||||||
|
# - neovim-stable
|
||||||
|
# - neovim-unstable
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install packages and test
|
||||||
|
env:
|
||||||
|
ENV: ${{ matrix.vim }}
|
||||||
|
run: |
|
||||||
|
export DEPS=~/deps
|
||||||
|
export PATH=~/deps/bin:$PATH
|
||||||
|
|
||||||
|
git config --global user.email "you@example.com"
|
||||||
|
git config --global user.name "Your Name"
|
||||||
|
|
||||||
|
case "$ENV" in
|
||||||
|
vim)
|
||||||
|
sudo apt-get install vim
|
||||||
|
;;
|
||||||
|
neovim-*)
|
||||||
|
sudo add-apt-repository ppa:neovim-ppa/${ENV/neovim-/}
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install neovim
|
||||||
|
|
||||||
|
mkdir -p $DEPS/bin
|
||||||
|
echo 'nvim "$@"' > $DEPS/bin/vim
|
||||||
|
chmod +x $DEPS/bin/vim
|
||||||
|
export VADER_OUTPUT_FILE=/dev/stderr
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
test/run !
|
||||||
85
.travis.yml
85
.travis.yml
@@ -1,54 +1,63 @@
|
|||||||
language: ruby
|
language: minimal
|
||||||
dist: trusty
|
|
||||||
sudo: false
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- DEPS=$HOME/deps
|
- DEPS=$HOME/deps
|
||||||
- PATH=$DEPS/bin:$PATH
|
- PATH=$DEPS/bin:$PATH
|
||||||
matrix:
|
jobs:
|
||||||
include:
|
include:
|
||||||
- env: ENV=vim72
|
- env: ENV=vim80-bionic
|
||||||
rvm: 1.8.7
|
dist: bionic
|
||||||
addons: { apt: { packages: [vim-nox] } }
|
stage: vim8
|
||||||
- env: ENV=python
|
- env: ENV=vim-nightly
|
||||||
rvm: 1.8.7
|
dist: trusty
|
||||||
addons: { apt: { packages: [python2.7-dev] } }
|
stage: vim8
|
||||||
- env: ENV=python3
|
- env: ENV=neovim-stable
|
||||||
rvm: 1.8.7
|
dist: bionic
|
||||||
addons: { apt: { packages: [python3-dev] } }
|
addons: {apt: {packages: [neovim], sources: [{sourceline: 'ppa:neovim-ppa/stable'}]}}
|
||||||
- env: ENV=ruby18
|
stage: neovim
|
||||||
rvm: 1.8.7
|
- env: ENV=neovim-nightly
|
||||||
- env: ENV=ruby20
|
dist: bionic
|
||||||
rvm: 2.0.0
|
addons: {apt: {packages: [neovim], sources: [{sourceline: 'ppa:neovim-ppa/unstable'}]}}
|
||||||
- env: ENV=neovim
|
stage: neovim
|
||||||
- env: ENV=vim8
|
- env: ENV=vim74-trusty-python
|
||||||
|
dist: trusty
|
||||||
|
stage: vim74
|
||||||
|
- env: ENV=vim74-xenial-python3
|
||||||
|
dist: xenial
|
||||||
|
stage: vim74
|
||||||
|
- env: ENV=vim74-trusty-ruby
|
||||||
|
dist: trusty
|
||||||
|
addons: {apt: {packages: [vim-nox]}}
|
||||||
|
stage: vim74
|
||||||
|
- env: ENV=vim74-xenial-ruby
|
||||||
|
dist: xenial
|
||||||
|
addons: {apt: {packages: [vim-nox]}}
|
||||||
|
stage: vim74
|
||||||
|
- env: ENV=osx-highsierra
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode9.4
|
||||||
|
stage: vim8
|
||||||
install: |
|
install: |
|
||||||
git config --global user.email "you@example.com"
|
git config --global user.email "you@example.com"
|
||||||
git config --global user.name "Your Name"
|
git config --global user.name "Your Name"
|
||||||
|
|
||||||
if [ "$ENV" == "vim72" ]; then
|
|
||||||
mkdir -p ${DEPS}/bin
|
|
||||||
ln -s /usr/bin/vim.nox ${DEPS}/bin/vim
|
|
||||||
return
|
|
||||||
elif [ "$ENV" == "neovim" ]; then
|
|
||||||
# https://github.com/neovim/bot-ci#nightly-builds
|
|
||||||
eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) nightly-x64"
|
|
||||||
mkdir -p ${DEPS}/bin
|
|
||||||
ln -s $(which nvim) ${DEPS}/bin/vim
|
|
||||||
export VADER_OUTPUT_FILE=/dev/stderr
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
C_OPTS="--prefix=$DEPS --with-features=huge --disable-gui "
|
C_OPTS="--prefix=$DEPS --with-features=huge --disable-gui "
|
||||||
case "$ENV" in
|
case "$ENV" in
|
||||||
python)
|
vim-*)
|
||||||
C_OPTS+=--enable-pythoninterp
|
|
||||||
;;
|
;;
|
||||||
python3)
|
neovim-*)
|
||||||
C_OPTS+=--enable-python3interp
|
mkdir -p ${DEPS}/bin
|
||||||
|
ln -s /usr/bin/nvim ${DEPS}/bin/vim
|
||||||
|
export VADER_OUTPUT_FILE=/dev/stderr
|
||||||
|
return
|
||||||
;;
|
;;
|
||||||
ruby*)
|
vim74-* | vim80-*)
|
||||||
C_OPTS+=--enable-rubyinterp
|
mkdir -p ${DEPS}/bin
|
||||||
|
ln -s /usr/bin/vim.nox ${DEPS}/bin/vim
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
75
README.md
75
README.md
@@ -7,8 +7,8 @@ A minimalist Vim plugin manager.
|
|||||||
|
|
||||||
### Pros.
|
### Pros.
|
||||||
|
|
||||||
- Easier to setup: Single file. No boilerplate code required.
|
- Easy to set up: Single file. No boilerplate code required.
|
||||||
- Easier to use: Concise, intuitive syntax
|
- Easy to use: Concise, intuitive syntax
|
||||||
- [Super-fast][40/4] parallel installation/update
|
- [Super-fast][40/4] parallel installation/update
|
||||||
(with any of `+job`, `+python`, `+python3`, `+ruby`, or [Neovim][nv])
|
(with any of `+job`, `+python`, `+python3`, `+ruby`, or [Neovim][nv])
|
||||||
- Creates shallow clones to minimize disk space usage and download time
|
- Creates shallow clones to minimize disk space usage and download time
|
||||||
@@ -44,36 +44,31 @@ file as suggested [here][auto].
|
|||||||
###### Windows (PowerShell)
|
###### Windows (PowerShell)
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
md ~\vimfiles\autoload
|
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
|
||||||
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
ni $HOME/vimfiles/autoload/plug.vim -Force
|
||||||
(New-Object Net.WebClient).DownloadFile(
|
|
||||||
$uri,
|
|
||||||
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
|
|
||||||
"~\vimfiles\autoload\plug.vim"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Neovim
|
#### Neovim
|
||||||
|
|
||||||
###### Unix
|
###### Unix, Linux
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
|
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
|
||||||
|
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
||||||
|
```
|
||||||
|
|
||||||
|
###### Linux (Flatpak)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fLo ~/.var/app/io.neovim.nvim/data/nvim/site/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
|
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
|
||||||
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
|
||||||
(New-Object Net.WebClient).DownloadFile(
|
|
||||||
$uri,
|
|
||||||
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
|
|
||||||
"~\AppData\Local\nvim\autoload\plug.vim"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Getting Help
|
### Getting Help
|
||||||
@@ -90,9 +85,9 @@ $uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
|||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
Add a vim-plug section to your `~/.vimrc` (or `~/.config/nvim/init.vim` for Neovim):
|
Add a vim-plug section to your `~/.vimrc` (or `stdpath('config') . '/init.vim'` for Neovim)
|
||||||
|
|
||||||
1. Begin the section with `call plug#begin()`
|
1. Begin the section with `call plug#begin([PLUGIN_DIR])`
|
||||||
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`.
|
- Automatically executes `filetype plugin indent on` and `syntax enable`.
|
||||||
@@ -101,10 +96,14 @@ Add a vim-plug section to your `~/.vimrc` (or `~/.config/nvim/init.vim` for Neov
|
|||||||
#### Example
|
#### Example
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
" Specify a directory for plugins
|
call plug#begin()
|
||||||
" - For Neovim: ~/.local/share/nvim/plugged
|
" The default plugin directory will be as follows:
|
||||||
" - Avoid using standard Vim directory names like 'plugin'
|
" - Vim (Linux/macOS): '~/.vim/plugged'
|
||||||
call plug#begin('~/.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
|
" Make sure you use single quotes
|
||||||
|
|
||||||
@@ -121,7 +120,7 @@ Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
|
|||||||
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
||||||
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
||||||
|
|
||||||
" Using a non-master branch
|
" Using a non-default branch
|
||||||
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
|
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
|
||||||
|
|
||||||
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
|
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
|
||||||
@@ -148,7 +147,7 @@ Reload .vimrc and `:PlugInstall` to install plugins.
|
|||||||
| ----------------------------------- | ------------------------------------------------------------------ |
|
| ----------------------------------- | ------------------------------------------------------------------ |
|
||||||
| `PlugInstall [name ...] [#threads]` | Install plugins |
|
| `PlugInstall [name ...] [#threads]` | Install plugins |
|
||||||
| `PlugUpdate [name ...] [#threads]` | Install or update plugins |
|
| `PlugUpdate [name ...] [#threads]` | Install or update plugins |
|
||||||
| `PlugClean[!]` | Remove unused directories (bang version will clean without prompt) |
|
| `PlugClean[!]` | Remove unlisted plugins (bang version will clean without prompt) |
|
||||||
| `PlugUpgrade` | Upgrade vim-plug itself |
|
| `PlugUpgrade` | Upgrade vim-plug itself |
|
||||||
| `PlugStatus` | Check the status of plugins |
|
| `PlugStatus` | Check the status of plugins |
|
||||||
| `PlugDiff` | Examine changes from the previous update and the pending changes |
|
| `PlugDiff` | Examine changes from the previous update and the pending changes |
|
||||||
@@ -223,18 +222,18 @@ Plug 'junegunn/goyo.vim', { 'for': 'markdown' }
|
|||||||
autocmd! User goyo.vim echom 'Goyo is now loaded!'
|
autocmd! User goyo.vim echom 'Goyo is now loaded!'
|
||||||
```
|
```
|
||||||
|
|
||||||
`for` option is generally not needed as most plugins for specific file types
|
The `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
|
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.
|
examine the output of `vim --startuptime` before applying the option.
|
||||||
|
|
||||||
### Post-update hooks
|
### Post-update hooks
|
||||||
|
|
||||||
There are some plugins that require extra steps after installation or update.
|
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.
|
In that case, use the `do` option to describe the task to be performed.
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
Plug 'Shougo/vimproc.vim', { 'do': 'make' }
|
Plug 'Shougo/vimproc.vim', { 'do': 'make' }
|
||||||
Plug 'Valloric/YouCompleteMe', { 'do': './install.py' }
|
Plug 'ycm-core/YouCompleteMe', { 'do': './install.py' }
|
||||||
```
|
```
|
||||||
|
|
||||||
If the value starts with `:`, it will be recognized as a Vim command.
|
If the value starts with `:`, it will be recognized as a Vim command.
|
||||||
@@ -257,7 +256,7 @@ function! BuildYCM(info)
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
Plug 'Valloric/YouCompleteMe', { 'do': function('BuildYCM') }
|
Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') }
|
||||||
```
|
```
|
||||||
|
|
||||||
Both forms of post-update hook are executed inside the directory of the plugin
|
Both forms of post-update hook are executed inside the directory of the plugin
|
||||||
@@ -265,7 +264,7 @@ 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
|
unconditionally with the bang-versions of the commands: `PlugInstall!` and
|
||||||
`PlugUpdate!`.
|
`PlugUpdate!`.
|
||||||
|
|
||||||
Make sure to escape BARs and double-quotes when you write `do` option inline
|
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
|
as they are mistakenly recognized as command separator or the start of the
|
||||||
trailing comment.
|
trailing comment.
|
||||||
|
|
||||||
@@ -291,7 +290,7 @@ The installer takes the following steps when installing/updating a plugin:
|
|||||||
1. Update submodules
|
1. Update submodules
|
||||||
2. Execute post-update hooks
|
2. Execute post-update hooks
|
||||||
|
|
||||||
The commands with `!` suffix ensure that all steps are run unconditionally.
|
The commands with the `!` suffix ensure that all steps are run unconditionally.
|
||||||
|
|
||||||
### Articles
|
### Articles
|
||||||
|
|
||||||
@@ -300,7 +299,11 @@ The commands with `!` suffix ensure that all steps are run unconditionally.
|
|||||||
- ~~[Thoughts on Vim plugin dependency](http://junegunn.kr/2013/09/thoughts-on-vim-plugin-dependency)~~
|
- ~~[Thoughts on Vim plugin dependency](http://junegunn.kr/2013/09/thoughts-on-vim-plugin-dependency)~~
|
||||||
- *Support for Plugfile has been removed since 0.5.0*
|
- *Support for Plugfile has been removed since 0.5.0*
|
||||||
|
|
||||||
|
### Collaborators
|
||||||
|
|
||||||
|
- [Jan Edmund Lazo](https://github.com/janlazo) - Windows support
|
||||||
|
- [Jeremy Pallats](https://github.com/starcraftman) - Python installer
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
MIT
|
MIT
|
||||||
|
|
||||||
|
|||||||
85
doc/plug.txt
85
doc/plug.txt
@@ -1,4 +1,4 @@
|
|||||||
plug.txt plug Last change: November 27 2017
|
plug.txt plug Last change: January 3 2022
|
||||||
PLUG - TABLE OF CONTENTS *plug* *plug-toc*
|
PLUG - TABLE OF CONTENTS *plug* *plug-toc*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
@@ -23,6 +23,7 @@ PLUG - TABLE OF CONTENTS *plug* *plug-to
|
|||||||
Post-update hooks
|
Post-update hooks
|
||||||
PlugInstall! and PlugUpdate!
|
PlugInstall! and PlugUpdate!
|
||||||
Articles
|
Articles
|
||||||
|
Collaborators
|
||||||
License
|
License
|
||||||
|
|
||||||
VIM-PLUG *vim-plug*
|
VIM-PLUG *vim-plug*
|
||||||
@@ -36,8 +37,8 @@ https://raw.githubusercontent.com/junegunn/i/master/vim-plug/installer.gif
|
|||||||
< Pros. >_____________________________________________________________________~
|
< Pros. >_____________________________________________________________________~
|
||||||
*plug-pros*
|
*plug-pros*
|
||||||
|
|
||||||
- Easier to setup: Single file. No boilerplate code required.
|
- Easy to set up: Single file. No boilerplate code required.
|
||||||
- Easier to use: Concise, intuitive syntax
|
- Easy to use: Concise, intuitive syntax
|
||||||
- {Super-fast}{1} parallel installation/update (with any of `+job`, `+python`,
|
- {Super-fast}{1} parallel installation/update (with any of `+job`, `+python`,
|
||||||
`+python3`, `+ruby`, or {Neovim}{2})
|
`+python3`, `+ruby`, or {Neovim}{2})
|
||||||
- Creates shallow clones to minimize disk space usage and download time
|
- Creates shallow clones to minimize disk space usage and download time
|
||||||
@@ -77,14 +78,8 @@ file as suggested {here}{5}.
|
|||||||
|
|
||||||
>> Windows (PowerShell)~
|
>> Windows (PowerShell)~
|
||||||
>
|
>
|
||||||
md ~\vimfiles\autoload
|
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
|
||||||
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
ni $HOME/vimfiles/autoload/plug.vim -Force
|
||||||
(New-Object Net.WebClient).DownloadFile(
|
|
||||||
$uri,
|
|
||||||
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
|
|
||||||
"~\vimfiles\autoload\plug.vim"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
<
|
<
|
||||||
|
|
||||||
Neovim~
|
Neovim~
|
||||||
@@ -93,20 +88,14 @@ Neovim~
|
|||||||
|
|
||||||
>> Unix~
|
>> Unix~
|
||||||
>
|
>
|
||||||
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
|
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/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)~
|
||||||
>
|
>
|
||||||
md ~\AppData\Local\nvim\autoload
|
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
|
||||||
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
|
ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
|
||||||
(New-Object Net.WebClient).DownloadFile(
|
|
||||||
$uri,
|
|
||||||
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
|
|
||||||
"~\AppData\Local\nvim\autoload\plug.vim"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
<
|
<
|
||||||
|
|
||||||
< Getting Help >______________________________________________________________~
|
< Getting Help >______________________________________________________________~
|
||||||
@@ -127,12 +116,12 @@ Neovim~
|
|||||||
< Usage >_____________________________________________________________________~
|
< Usage >_____________________________________________________________________~
|
||||||
*plug-usage*
|
*plug-usage*
|
||||||
|
|
||||||
Add a vim-plug section to your `~/.vimrc` (or `~/.config/nvim/init.vim` for
|
Add a vim-plug section to your `~/.vimrc` (or `stdpath('config') . '/init.vim'` for
|
||||||
Neovim):
|
Neovim)
|
||||||
|
|
||||||
*plug#begin* *plug#end*
|
*plug#begin* *plug#end*
|
||||||
|
|
||||||
1. Begin the section with `call plug#begin()`
|
1. Begin the section with `call plug#begin([PLUGIN_DIR])`
|
||||||
2. List the plugins with `Plug` commands
|
2. List the plugins with `Plug` commands
|
||||||
3. `call plug#end()` to update 'runtimepath' and initialize plugin system
|
3. `call plug#end()` to update 'runtimepath' and initialize plugin system
|
||||||
- Automatically executes `filetype plugin indent on` and `syntax enable`.
|
- Automatically executes `filetype plugin indent on` and `syntax enable`.
|
||||||
@@ -143,10 +132,14 @@ Neovim):
|
|||||||
Example~
|
Example~
|
||||||
*plug-example*
|
*plug-example*
|
||||||
>
|
>
|
||||||
" Specify a directory for plugins
|
call plug#begin()
|
||||||
" - For Neovim: ~/.local/share/nvim/plugged
|
" The default plugin directory will be as follows:
|
||||||
" - Avoid using standard Vim directory names like 'plugin'
|
" - Vim (Linux/macOS): '~/.vim/plugged'
|
||||||
call plug#begin('~/.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
|
" Make sure you use single quotes
|
||||||
|
|
||||||
@@ -163,7 +156,7 @@ Example~
|
|||||||
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
||||||
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
||||||
|
|
||||||
" Using a non-master branch
|
" Using a non-default branch
|
||||||
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
|
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
|
||||||
|
|
||||||
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
|
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
|
||||||
@@ -194,7 +187,7 @@ Reload .vimrc and `:PlugInstall` to install plugins.
|
|||||||
------------------------------------+-------------------------------------------------------------------
|
------------------------------------+-------------------------------------------------------------------
|
||||||
`PlugInstall [name ...] [#threads]` | Install plugins
|
`PlugInstall [name ...] [#threads]` | Install plugins
|
||||||
`PlugUpdate [name ...] [#threads]` | Install or update plugins
|
`PlugUpdate [name ...] [#threads]` | Install or update plugins
|
||||||
`PlugClean[!]` | Remove unused directories (bang version will clean without prompt)
|
`PlugClean[!]` | Remove unlisted plugins (bang version will clean without prompt)
|
||||||
`PlugUpgrade` | Upgrade vim-plug itself
|
`PlugUpgrade` | Upgrade vim-plug itself
|
||||||
`PlugStatus` | Check the status of plugins
|
`PlugStatus` | Check the status of plugins
|
||||||
`PlugDiff` | Examine changes from the previous update and the pending changes
|
`PlugDiff` | Examine changes from the previous update and the pending changes
|
||||||
@@ -204,6 +197,7 @@ Reload .vimrc and `:PlugInstall` to install plugins.
|
|||||||
|
|
||||||
< Plug options >______________________________________________________________~
|
< Plug options >______________________________________________________________~
|
||||||
*plug-options*
|
*plug-options*
|
||||||
|
*:Plug*
|
||||||
|
|
||||||
------------------------+-----------------------------------------------
|
------------------------+-----------------------------------------------
|
||||||
Option | Description ~
|
Option | Description ~
|
||||||
@@ -284,19 +278,19 @@ Reload .vimrc and `:PlugInstall` to install plugins.
|
|||||||
Plug 'junegunn/goyo.vim', { 'for': 'markdown' }
|
Plug 'junegunn/goyo.vim', { 'for': 'markdown' }
|
||||||
autocmd! User goyo.vim echom 'Goyo is now loaded!'
|
autocmd! User goyo.vim echom 'Goyo is now loaded!'
|
||||||
<
|
<
|
||||||
`for` option is generally not needed as most plugins for specific file types
|
The `for` option is generally not needed as most plugins for specific file
|
||||||
usually don't have too much code in `plugin` directory. You might want to
|
types usually don't have too much code in the `plugin` directory. You might
|
||||||
examine the output of `vim --startuptime` before applying the option.
|
want to examine the output of `vim --startuptime` before applying the option.
|
||||||
|
|
||||||
|
|
||||||
< Post-update hooks >_________________________________________________________~
|
< Post-update hooks >_________________________________________________________~
|
||||||
*plug-post-update-hooks*
|
*plug-post-update-hooks*
|
||||||
|
|
||||||
There are some plugins that require extra steps after installation or update.
|
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.
|
In that case, use the `do` option to describe the task to be performed.
|
||||||
>
|
>
|
||||||
Plug 'Shougo/vimproc.vim', { 'do': 'make' }
|
Plug 'Shougo/vimproc.vim', { 'do': 'make' }
|
||||||
Plug 'Valloric/YouCompleteMe', { 'do': './install.py' }
|
Plug 'ycm-core/YouCompleteMe', { 'do': './install.py' }
|
||||||
<
|
<
|
||||||
If the value starts with `:`, it will be recognized as a Vim command.
|
If the value starts with `:`, it will be recognized as a Vim command.
|
||||||
|
|
||||||
@@ -317,16 +311,16 @@ takes a single argument.
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
Plug 'Valloric/YouCompleteMe', { 'do': function('BuildYCM') }
|
Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') }
|
||||||
<
|
<
|
||||||
Both forms of post-update hook are executed inside the directory of the plugin
|
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
|
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
|
unconditionally with the bang-versions of the commands: `PlugInstall!` and
|
||||||
`PlugUpdate!`.
|
`PlugUpdate!`.
|
||||||
|
|
||||||
Make sure to escape BARs and double-quotes when you write `do` option inline
|
Make sure to escape BARs and double-quotes when you write the `do` option
|
||||||
as they are mistakenly recognized as command separator or the start of the
|
inline as they are mistakenly recognized as command separator or the start of
|
||||||
trailing comment.
|
the trailing comment.
|
||||||
>
|
>
|
||||||
Plug 'junegunn/fzf', { 'do': 'yes \| ./install' }
|
Plug 'junegunn/fzf', { 'do': 'yes \| ./install' }
|
||||||
<
|
<
|
||||||
@@ -350,7 +344,8 @@ The installer takes the following steps when installing/updating a plugin:
|
|||||||
1. Update submodules
|
1. Update submodules
|
||||||
2. Execute post-update hooks
|
2. Execute post-update hooks
|
||||||
|
|
||||||
The commands with `!` suffix ensure that all steps are run unconditionally.
|
The commands with the `!` suffix ensure that all steps are run
|
||||||
|
unconditionally.
|
||||||
|
|
||||||
|
|
||||||
< Articles >__________________________________________________________________~
|
< Articles >__________________________________________________________________~
|
||||||
@@ -366,6 +361,16 @@ The commands with `!` suffix ensure that all steps are run unconditionally.
|
|||||||
{13} http://junegunn.kr/2013/09/thoughts-on-vim-plugin-dependency
|
{13} http://junegunn.kr/2013/09/thoughts-on-vim-plugin-dependency
|
||||||
|
|
||||||
|
|
||||||
|
< Collaborators >_____________________________________________________________~
|
||||||
|
*plug-collaborators*
|
||||||
|
|
||||||
|
- {Jan Edmund Lazo}{14} - Windows support
|
||||||
|
- {Jeremy Pallats}{15} - Python installer
|
||||||
|
|
||||||
|
{14} https://github.com/janlazo
|
||||||
|
{15} https://github.com/starcraftman
|
||||||
|
|
||||||
|
|
||||||
< License >___________________________________________________________________~
|
< License >___________________________________________________________________~
|
||||||
*plug-license*
|
*plug-license*
|
||||||
|
|
||||||
|
|||||||
534
plug.vim
534
plug.vim
@@ -25,7 +25,7 @@
|
|||||||
" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
||||||
" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
||||||
"
|
"
|
||||||
" " Using a non-master branch
|
" " Using a non-default branch
|
||||||
" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
|
" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
|
||||||
"
|
"
|
||||||
" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
|
" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
|
||||||
@@ -99,8 +99,14 @@ let s:mac_gui = has('gui_macvim') && has('gui_running')
|
|||||||
let s:is_win = has('win32')
|
let s:is_win = has('win32')
|
||||||
let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
|
let s:nvim = has('nvim-0.2') || (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'))
|
if s:is_win && &shellslash
|
||||||
let s:base_spec = { 'branch': 'master', 'frozen': 0 }
|
set noshellslash
|
||||||
|
let s:me = resolve(expand('<sfile>:p'))
|
||||||
|
set shellslash
|
||||||
|
else
|
||||||
|
let s:me = resolve(expand('<sfile>:p'))
|
||||||
|
endif
|
||||||
|
let s:base_spec = { 'branch': '', 'frozen': 0 }
|
||||||
let s:TYPE = {
|
let s:TYPE = {
|
||||||
\ 'string': type(''),
|
\ 'string': type(''),
|
||||||
\ 'list': type([]),
|
\ 'list': type([]),
|
||||||
@@ -110,18 +116,140 @@ let s:TYPE = {
|
|||||||
let s:loaded = get(s:, 'loaded', {})
|
let s:loaded = get(s:, 'loaded', {})
|
||||||
let s:triggers = get(s:, 'triggers', {})
|
let s:triggers = get(s:, 'triggers', {})
|
||||||
|
|
||||||
|
function! s:is_powershell(shell)
|
||||||
|
return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:isabsolute(dir) abort
|
||||||
|
return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:git_dir(dir) abort
|
||||||
|
let gitdir = s:trim(a:dir) . '/.git'
|
||||||
|
if isdirectory(gitdir)
|
||||||
|
return gitdir
|
||||||
|
endif
|
||||||
|
if !filereadable(gitdir)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
|
||||||
|
if len(gitdir) && !s:isabsolute(gitdir)
|
||||||
|
let gitdir = a:dir . '/' . gitdir
|
||||||
|
endif
|
||||||
|
return isdirectory(gitdir) ? gitdir : ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:git_origin_url(dir) abort
|
||||||
|
let gitdir = s:git_dir(a:dir)
|
||||||
|
let config = gitdir . '/config'
|
||||||
|
if empty(gitdir) || !filereadable(config)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:git_revision(dir) abort
|
||||||
|
let gitdir = s:git_dir(a:dir)
|
||||||
|
let head = gitdir . '/HEAD'
|
||||||
|
if empty(gitdir) || !filereadable(head)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let line = get(readfile(head), 0, '')
|
||||||
|
let ref = matchstr(line, '^ref: \zs.*')
|
||||||
|
if empty(ref)
|
||||||
|
return line
|
||||||
|
endif
|
||||||
|
|
||||||
|
if filereadable(gitdir . '/' . ref)
|
||||||
|
return get(readfile(gitdir . '/' . ref), 0, '')
|
||||||
|
endif
|
||||||
|
|
||||||
|
if filereadable(gitdir . '/packed-refs')
|
||||||
|
for line in readfile(gitdir . '/packed-refs')
|
||||||
|
if line =~# ' ' . ref
|
||||||
|
return matchstr(line, '^[0-9a-f]*')
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:git_local_branch(dir) abort
|
||||||
|
let gitdir = s:git_dir(a:dir)
|
||||||
|
let head = gitdir . '/HEAD'
|
||||||
|
if empty(gitdir) || !filereadable(head)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
|
||||||
|
return len(branch) ? branch : 'HEAD'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:git_origin_branch(spec)
|
||||||
|
if len(a:spec.branch)
|
||||||
|
return a:spec.branch
|
||||||
|
endif
|
||||||
|
|
||||||
|
" The file may not be present if this is a local repository
|
||||||
|
let gitdir = s:git_dir(a:spec.dir)
|
||||||
|
let origin_head = gitdir.'/refs/remotes/origin/HEAD'
|
||||||
|
if len(gitdir) && filereadable(origin_head)
|
||||||
|
return matchstr(get(readfile(origin_head), 0, ''),
|
||||||
|
\ '^ref: refs/remotes/origin/\zs.*')
|
||||||
|
endif
|
||||||
|
|
||||||
|
" The command may not return the name of a branch in detached HEAD state
|
||||||
|
let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
|
||||||
|
return v:shell_error ? '' : result[-1]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if s:is_win
|
||||||
|
function! s:plug_call(fn, ...)
|
||||||
|
let shellslash = &shellslash
|
||||||
|
try
|
||||||
|
set noshellslash
|
||||||
|
return call(a:fn, a:000)
|
||||||
|
finally
|
||||||
|
let &shellslash = shellslash
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:plug_call(fn, ...)
|
||||||
|
return call(a:fn, a:000)
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:plug_getcwd()
|
||||||
|
return s:plug_call('getcwd')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:plug_fnamemodify(fname, mods)
|
||||||
|
return s:plug_call('fnamemodify', a:fname, a:mods)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:plug_expand(fmt)
|
||||||
|
return s:plug_call('expand', a:fmt, 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:plug_tempname()
|
||||||
|
return s:plug_call('tempname')
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! plug#begin(...)
|
function! plug#begin(...)
|
||||||
if a:0 > 0
|
if a:0 > 0
|
||||||
let s:plug_home_org = a:1
|
let s:plug_home_org = a:1
|
||||||
let home = s:path(fnamemodify(expand(a:1), ':p'))
|
let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
|
||||||
elseif exists('g:plug_home')
|
elseif exists('g:plug_home')
|
||||||
let home = s:path(g:plug_home)
|
let home = s:path(g:plug_home)
|
||||||
|
elseif has('nvim')
|
||||||
|
let home = stdpath('data') . '/plugged'
|
||||||
elseif !empty(&rtp)
|
elseif !empty(&rtp)
|
||||||
let home = s:path(split(&rtp, ',')[0]) . '/plugged'
|
let home = s:path(split(&rtp, ',')[0]) . '/plugged'
|
||||||
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
|
if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
|
||||||
return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
|
return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -139,6 +267,16 @@ function! s:define_commands()
|
|||||||
if !executable('git')
|
if !executable('git')
|
||||||
return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
|
return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
|
||||||
endif
|
endif
|
||||||
|
if has('win32')
|
||||||
|
\ && &shellslash
|
||||||
|
\ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell))
|
||||||
|
return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
|
||||||
|
endif
|
||||||
|
if !has('nvim')
|
||||||
|
\ && (has('win32') || has('win32unix'))
|
||||||
|
\ && !has('multi_byte')
|
||||||
|
return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
|
||||||
|
endif
|
||||||
command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
|
command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
|
||||||
command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
|
command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
|
||||||
command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
|
command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
|
||||||
@@ -203,7 +341,7 @@ 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('plug#end() called without calling plug#begin() first')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if exists('#PlugLOD')
|
if exists('#PlugLOD')
|
||||||
@@ -269,7 +407,7 @@ function! plug#end()
|
|||||||
|
|
||||||
for [map, names] in items(lod.map)
|
for [map, names] in items(lod.map)
|
||||||
for [mode, map_prefix, key_prefix] in
|
for [mode, map_prefix, key_prefix] in
|
||||||
\ [['i', '<C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
|
\ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
|
||||||
execute printf(
|
execute printf(
|
||||||
\ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
|
\ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
|
||||||
\ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
|
\ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
|
||||||
@@ -324,7 +462,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']))[2], '\.'), '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
|
||||||
@@ -334,11 +472,11 @@ function! s:progress_opt(base)
|
|||||||
\ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
|
\ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
if s:is_win
|
function! s:rtp(spec)
|
||||||
function! s:rtp(spec)
|
return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
|
||||||
return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
|
endfunction
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
if s:is_win
|
||||||
function! s:path(path)
|
function! s:path(path)
|
||||||
return s:trim(substitute(a:path, '/', '\', 'g'))
|
return s:trim(substitute(a:path, '/', '\', 'g'))
|
||||||
endfunction
|
endfunction
|
||||||
@@ -350,11 +488,33 @@ if s:is_win
|
|||||||
function! s:is_local_plug(repo)
|
function! s:is_local_plug(repo)
|
||||||
return a:repo =~? '^[a-z]:\|^[%~]'
|
return a:repo =~? '^[a-z]:\|^[%~]'
|
||||||
endfunction
|
endfunction
|
||||||
else
|
|
||||||
function! s:rtp(spec)
|
" Copied from fzf
|
||||||
return s:dirpath(a:spec.dir . get(a:spec, 'rtp', ''))
|
function! s:wrap_cmds(cmds)
|
||||||
|
let cmds = [
|
||||||
|
\ '@echo off',
|
||||||
|
\ 'setlocal enabledelayedexpansion']
|
||||||
|
\ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
|
||||||
|
\ + ['endlocal']
|
||||||
|
if has('iconv')
|
||||||
|
if !exists('s:codepage')
|
||||||
|
let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
|
||||||
|
endif
|
||||||
|
return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
|
||||||
|
endif
|
||||||
|
return map(cmds, 'v:val."\r"')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:batchfile(cmd)
|
||||||
|
let batchfile = s:plug_tempname().'.bat'
|
||||||
|
call writefile(s:wrap_cmds(a:cmd), batchfile)
|
||||||
|
let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
|
||||||
|
if s:is_powershell(&shell)
|
||||||
|
let cmd = '& ' . cmd
|
||||||
|
endif
|
||||||
|
return [batchfile, cmd]
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
function! s:path(path)
|
function! s:path(path)
|
||||||
return s:trim(a:path)
|
return s:trim(a:path)
|
||||||
endfunction
|
endfunction
|
||||||
@@ -434,8 +594,8 @@ endfunction
|
|||||||
|
|
||||||
function! s:dobufread(names)
|
function! s:dobufread(names)
|
||||||
for name in a:names
|
for name in a: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', 'after/ftdetect', 'after/ftplugin']
|
||||||
if len(finddir(dir, path))
|
if len(finddir(dir, path))
|
||||||
if exists('#BufRead')
|
if exists('#BufRead')
|
||||||
doautocmd BufRead
|
doautocmd BufRead
|
||||||
@@ -554,7 +714,7 @@ function! plug#(repo, ...)
|
|||||||
try
|
try
|
||||||
let repo = s:trim(a:repo)
|
let repo = s:trim(a:repo)
|
||||||
let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
|
let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
|
||||||
let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??'))
|
let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
|
||||||
let spec = extend(s:infer_properties(name, repo), opts)
|
let spec = extend(s:infer_properties(name, repo), opts)
|
||||||
if !has_key(g:plugs, name)
|
if !has_key(g:plugs, name)
|
||||||
call add(g:plugs_order, name)
|
call add(g:plugs_order, name)
|
||||||
@@ -562,19 +722,41 @@ function! plug#(repo, ...)
|
|||||||
let g:plugs[name] = spec
|
let g:plugs[name] = spec
|
||||||
let s:loaded[name] = get(s:loaded, name, 0)
|
let s:loaded[name] = get(s:loaded, name, 0)
|
||||||
catch
|
catch
|
||||||
return s:err(v:exception)
|
return s:err(repo . ' ' . v:exception)
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:parse_options(arg)
|
function! s:parse_options(arg)
|
||||||
let opts = copy(s:base_spec)
|
let opts = copy(s:base_spec)
|
||||||
let type = type(a:arg)
|
let type = type(a:arg)
|
||||||
|
let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)'
|
||||||
if type == s:TYPE.string
|
if type == s:TYPE.string
|
||||||
|
if empty(a:arg)
|
||||||
|
throw printf(opt_errfmt, 'tag', 'string')
|
||||||
|
endif
|
||||||
let opts.tag = a:arg
|
let opts.tag = a:arg
|
||||||
elseif type == s:TYPE.dict
|
elseif type == s:TYPE.dict
|
||||||
|
for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
|
||||||
|
if has_key(a:arg, opt)
|
||||||
|
\ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
|
||||||
|
throw printf(opt_errfmt, opt, 'string')
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
for opt in ['on', 'for']
|
||||||
|
if has_key(a:arg, opt)
|
||||||
|
\ && type(a:arg[opt]) != s:TYPE.list
|
||||||
|
\ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
|
||||||
|
throw printf(opt_errfmt, opt, 'string or list')
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if has_key(a:arg, 'do')
|
||||||
|
\ && type(a:arg.do) != s:TYPE.funcref
|
||||||
|
\ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do))
|
||||||
|
throw printf(opt_errfmt, 'do', 'string or funcref')
|
||||||
|
endif
|
||||||
call extend(opts, a:arg)
|
call extend(opts, a:arg)
|
||||||
if has_key(opts, 'dir')
|
if has_key(opts, 'dir')
|
||||||
let opts.dir = s:dirpath(expand(opts.dir))
|
let opts.dir = s:dirpath(s:plug_expand(opts.dir))
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
throw 'Invalid argument type (expected: string or dictionary)'
|
throw 'Invalid argument type (expected: string or dictionary)'
|
||||||
@@ -585,7 +767,7 @@ endfunction
|
|||||||
function! s:infer_properties(name, repo)
|
function! s:infer_properties(name, repo)
|
||||||
let repo = a:repo
|
let repo = a:repo
|
||||||
if s:is_local_plug(repo)
|
if s:is_local_plug(repo)
|
||||||
return { 'dir': s:dirpath(expand(repo)) }
|
return { 'dir': s:dirpath(s:plug_expand(repo)) }
|
||||||
else
|
else
|
||||||
if repo =~ ':'
|
if repo =~ ':'
|
||||||
let uri = repo
|
let uri = repo
|
||||||
@@ -628,7 +810,7 @@ function! s:syntax()
|
|||||||
syn match plugNumber /[0-9]\+[0-9.]*/ contained
|
syn match plugNumber /[0-9]\+[0-9.]*/ contained
|
||||||
syn match plugBracket /[[\]]/ contained
|
syn match plugBracket /[[\]]/ contained
|
||||||
syn match plugX /x/ contained
|
syn match plugX /x/ contained
|
||||||
syn match plugDash /^-/
|
syn match plugDash /^-\{1}\ /
|
||||||
syn match plugPlus /^+/
|
syn match plugPlus /^+/
|
||||||
syn match plugStar /^*/
|
syn match plugStar /^*/
|
||||||
syn match plugMessage /\(^- \)\@<=.*/
|
syn match plugMessage /\(^- \)\@<=.*/
|
||||||
@@ -646,6 +828,7 @@ function! s:syntax()
|
|||||||
syn match plugError /^x.*/
|
syn match plugError /^x.*/
|
||||||
syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
|
syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
|
||||||
syn match plugH2 /^.*:\n-\+$/
|
syn match plugH2 /^.*:\n-\+$/
|
||||||
|
syn match plugH2 /^-\{2,}/
|
||||||
syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
|
syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
|
||||||
hi def link plug1 Title
|
hi def link plug1 Title
|
||||||
hi def link plug2 Repeat
|
hi def link plug2 Repeat
|
||||||
@@ -738,7 +921,7 @@ function! s:finish_bindings()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:prepare(...)
|
function! s:prepare(...)
|
||||||
if empty(getcwd())
|
if empty(s:plug_getcwd())
|
||||||
throw 'Invalid current working directory. Cannot proceed.'
|
throw 'Invalid current working directory. Cannot proceed.'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -758,7 +941,7 @@ function! s:prepare(...)
|
|||||||
call s:new_window()
|
call s:new_window()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nnoremap <silent> <buffer> q :if b:plug_preview==1<bar>pc<bar>endif<bar>bd<cr>
|
nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
|
||||||
if a:0 == 0
|
if a:0 == 0
|
||||||
call s:finish_bindings()
|
call s:finish_bindings()
|
||||||
endif
|
endif
|
||||||
@@ -780,6 +963,15 @@ function! s:prepare(...)
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:close_pane()
|
||||||
|
if b:plug_preview == 1
|
||||||
|
pc
|
||||||
|
let b:plug_preview = -1
|
||||||
|
else
|
||||||
|
bd
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! s:assign_name()
|
function! s:assign_name()
|
||||||
" Assign buffer name
|
" Assign buffer name
|
||||||
let prefix = '[Plugins]'
|
let prefix = '[Plugins]'
|
||||||
@@ -794,31 +986,35 @@ endfunction
|
|||||||
|
|
||||||
function! s:chsh(swap)
|
function! s:chsh(swap)
|
||||||
let prev = [&shell, &shellcmdflag, &shellredir]
|
let prev = [&shell, &shellcmdflag, &shellredir]
|
||||||
if s:is_win
|
if !s:is_win
|
||||||
set shell=cmd.exe shellcmdflag=/c shellredir=>%s\ 2>&1
|
set shell=sh
|
||||||
elseif a:swap
|
endif
|
||||||
set shell=sh shellredir=>%s\ 2>&1
|
if a:swap
|
||||||
|
if s:is_powershell(&shell)
|
||||||
|
let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s'
|
||||||
|
elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$'
|
||||||
|
set shellredir=>%s\ 2>&1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
return prev
|
return prev
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:bang(cmd, ...)
|
function! s:bang(cmd, ...)
|
||||||
|
let batchfile = ''
|
||||||
try
|
try
|
||||||
let [sh, shellcmdflag, shrd] = s:chsh(a:0)
|
let [sh, shellcmdflag, 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
|
if s:is_win
|
||||||
let batchfile = tempname().'.bat'
|
let [batchfile, cmd] = s:batchfile(cmd)
|
||||||
call writefile(["@echo off\r", cmd . "\r"], batchfile)
|
|
||||||
let cmd = batchfile
|
|
||||||
endif
|
endif
|
||||||
let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
|
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, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
|
||||||
if s:is_win
|
if s:is_win && filereadable(batchfile)
|
||||||
call delete(batchfile)
|
call delete(batchfile)
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
@@ -831,7 +1027,7 @@ function! s:regress_bar()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:is_updated(dir)
|
function! s:is_updated(dir)
|
||||||
return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir))
|
return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:do(pull, force, todo)
|
function! s:do(pull, force, todo)
|
||||||
@@ -868,6 +1064,7 @@ function! s:do(pull, force, todo)
|
|||||||
endif
|
endif
|
||||||
elseif type == s:TYPE.funcref
|
elseif type == s:TYPE.funcref
|
||||||
try
|
try
|
||||||
|
call s:load_plugin(spec)
|
||||||
let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
|
let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
|
||||||
call spec.do({ 'name': name, 'status': status, 'force': a:force })
|
call spec.do({ 'name': name, 'status': status, 'force': a:force })
|
||||||
catch
|
catch
|
||||||
@@ -894,10 +1091,11 @@ endfunction
|
|||||||
|
|
||||||
function! s:checkout(spec)
|
function! s:checkout(spec)
|
||||||
let sha = a:spec.commit
|
let sha = a:spec.commit
|
||||||
let output = s:system('git rev-parse HEAD', a:spec.dir)
|
let output = s:git_revision(a:spec.dir)
|
||||||
if !v:shell_error && !s:hash_match(sha, s:lines(output)[0])
|
if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
|
||||||
|
let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
|
||||||
let output = s:system(
|
let output = s:system(
|
||||||
\ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir)
|
\ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
|
||||||
endif
|
endif
|
||||||
return output
|
return output
|
||||||
endfunction
|
endfunction
|
||||||
@@ -1012,11 +1210,17 @@ function! s:update_impl(pull, force, args) abort
|
|||||||
normal! 2G
|
normal! 2G
|
||||||
silent! redraw
|
silent! redraw
|
||||||
|
|
||||||
let s:clone_opt = get(g:, 'plug_shallow', 1) ?
|
" Set remote name, overriding a possible user git config's clone.defaultRemoteName
|
||||||
\ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : ''
|
let s:clone_opt = ['--origin', 'origin']
|
||||||
|
if get(g:, 'plug_shallow', 1)
|
||||||
|
call extend(s:clone_opt, ['--depth', '1'])
|
||||||
|
if s:git_version_requirement(1, 7, 10)
|
||||||
|
call add(s:clone_opt, '--no-single-branch')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
if has('win32unix')
|
if has('win32unix') || has('wsl')
|
||||||
let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input'
|
call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input'])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
|
let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
|
||||||
@@ -1094,7 +1298,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 '.plug#shellescape(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,12 +1306,12 @@ 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 '.plug#shellescape(tag).' -- 2>&1', spec.dir)
|
||||||
else
|
else
|
||||||
let branch = s:esc(get(spec, 'branch', 'master'))
|
let branch = s:git_origin_branch(spec)
|
||||||
call s:log4(name, 'Merging origin/'.branch)
|
call s:log4(name, 'Merging origin/'.s:esc(branch))
|
||||||
let out = s:system('git checkout -q '.branch.' -- 2>&1'
|
let out = s:system('git checkout -q '.plug#shellescape(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 '.plug#shellescape('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))
|
||||||
@@ -1151,7 +1355,7 @@ function! s:job_abort()
|
|||||||
silent! call job_stop(j.jobid)
|
silent! call job_stop(j.jobid)
|
||||||
endif
|
endif
|
||||||
if j.new
|
if j.new
|
||||||
call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir))
|
call s:rm_rf(g:plugs[name].dir)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
let s:jobs = {}
|
let s:jobs = {}
|
||||||
@@ -1197,29 +1401,27 @@ function! s:job_cb(fn, job, ch, data)
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:nvim_cb(job_id, data, event) dict abort
|
function! s:nvim_cb(job_id, data, event) dict abort
|
||||||
return a:event == 'stdout' ?
|
return (a:event == 'stdout' || a:event == 'stderr') ?
|
||||||
\ 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)
|
||||||
endfunction
|
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
|
|
||||||
if !empty(job.batchfile)
|
|
||||||
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
|
||||||
|
if has_key(a:opts, 'dir')
|
||||||
|
let job.cwd = a:opts.dir
|
||||||
|
endif
|
||||||
|
let argv = a:cmd
|
||||||
call extend(job, {
|
call extend(job, {
|
||||||
\ 'on_stdout': function('s:nvim_cb'),
|
\ 'on_stdout': function('s:nvim_cb'),
|
||||||
|
\ 'on_stderr': function('s:nvim_cb'),
|
||||||
\ 'on_exit': function('s:nvim_cb'),
|
\ 'on_exit': function('s:nvim_cb'),
|
||||||
\ })
|
\ })
|
||||||
let jid = jobstart(argv, job)
|
let jid = s:plug_call('jobstart', argv, job)
|
||||||
if jid > 0
|
if jid > 0
|
||||||
let job.jobid = jid
|
let job.jobid = jid
|
||||||
else
|
else
|
||||||
@@ -1229,9 +1431,16 @@ 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 cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})'))
|
||||||
|
if has_key(a:opts, 'dir')
|
||||||
|
let cmd = s:with_cd(cmd, a:opts.dir, 0)
|
||||||
|
endif
|
||||||
|
let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
|
||||||
let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
|
let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
|
||||||
\ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
|
\ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
|
||||||
|
\ 'err_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]),
|
||||||
|
\ 'err_mode': 'raw',
|
||||||
\ 'out_mode': 'raw'
|
\ 'out_mode': 'raw'
|
||||||
\})
|
\})
|
||||||
if job_status(jid) == 'run'
|
if job_status(jid) == 'run'
|
||||||
@@ -1242,7 +1451,7 @@ 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 job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]))
|
||||||
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 +1471,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
|
||||||
|
|
||||||
@@ -1279,9 +1485,10 @@ function! s:bar()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:logpos(name)
|
function! s:logpos(name)
|
||||||
for i in range(4, line('$'))
|
let max = line('$')
|
||||||
|
for i in range(4, max > 4 ? max : 4)
|
||||||
if getline(i) =~# '^[-+x*] '.a:name.':'
|
if getline(i) =~# '^[-+x*] '.a:name.':'
|
||||||
for j in range(i + 1, line('$'))
|
for j in range(i + 1, max > 5 ? max : 5)
|
||||||
if getline(j) !~ '^ '
|
if getline(j) !~ '^ '
|
||||||
return [i, j - 1]
|
return [i, j - 1]
|
||||||
endif
|
endif
|
||||||
@@ -1341,8 +1548,14 @@ while 1 " Without TCO, Vim stack is bound to explode
|
|||||||
let [error, _] = s:git_validate(spec, 0)
|
let [error, _] = s:git_validate(spec, 0)
|
||||||
if empty(error)
|
if empty(error)
|
||||||
if pull
|
if pull
|
||||||
let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : ''
|
let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
|
||||||
call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir })
|
if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
|
||||||
|
call extend(cmd, ['--depth', '99999999'])
|
||||||
|
endif
|
||||||
|
if !empty(prog)
|
||||||
|
call add(cmd, prog)
|
||||||
|
endif
|
||||||
|
call s:spawn(name, cmd, { 'dir': spec.dir })
|
||||||
else
|
else
|
||||||
let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
|
let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
|
||||||
endif
|
endif
|
||||||
@@ -1350,12 +1563,14 @@ while 1 " Without TCO, Vim stack is bound to explode
|
|||||||
let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
|
let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
call s:spawn(name,
|
let cmd = ['git', 'clone']
|
||||||
\ printf('git clone %s %s %s %s 2>&1',
|
if !has_tag
|
||||||
\ has_tag ? '' : s:clone_opt,
|
call extend(cmd, s:clone_opt)
|
||||||
\ prog,
|
endif
|
||||||
\ s:shellesc(spec.uri),
|
if !empty(prog)
|
||||||
\ s:shellesc(s:trim(spec.dir))), { 'new': 1 })
|
call add(cmd, prog)
|
||||||
|
endif
|
||||||
|
call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 })
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !s:jobs[name].running
|
if !s:jobs[name].running
|
||||||
@@ -1392,7 +1607,7 @@ G_NVIM = vim.eval("has('nvim')") == '1'
|
|||||||
G_PULL = vim.eval('s:update.pull') == '1'
|
G_PULL = vim.eval('s:update.pull') == '1'
|
||||||
G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
|
G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
|
||||||
G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
|
G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
|
||||||
G_CLONE_OPT = vim.eval('s:clone_opt')
|
G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt'))
|
||||||
G_PROGRESS = vim.eval('s:progress_opt(1)')
|
G_PROGRESS = vim.eval('s:progress_opt(1)')
|
||||||
G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
|
G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
|
||||||
G_STOP = thr.Event()
|
G_STOP = thr.Event()
|
||||||
@@ -1929,7 +2144,7 @@ function! s:update_ruby()
|
|||||||
end
|
end
|
||||||
} if VIM::evaluate('s:mac_gui') == 1
|
} if VIM::evaluate('s:mac_gui') == 1
|
||||||
|
|
||||||
clone_opt = VIM::evaluate('s:clone_opt')
|
clone_opt = VIM::evaluate('s:clone_opt').join(' ')
|
||||||
progress = VIM::evaluate('s:progress_opt(1)')
|
progress = VIM::evaluate('s:progress_opt(1)')
|
||||||
nthr.times do
|
nthr.times do
|
||||||
mtx.synchronize do
|
mtx.synchronize do
|
||||||
@@ -1982,19 +2197,45 @@ function! s:update_ruby()
|
|||||||
EOF
|
EOF
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:shellesc_cmd(arg)
|
function! s:shellesc_cmd(arg, script)
|
||||||
let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g')
|
let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
|
||||||
let escaped = substitute(escaped, '%', '%%', 'g')
|
return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
|
||||||
let escaped = substitute(escaped, '"', '\\^&', 'g')
|
|
||||||
let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g')
|
|
||||||
return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"'
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:shellesc(arg)
|
function! s:shellesc_ps1(arg)
|
||||||
if &shell =~# 'cmd.exe$'
|
return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
|
||||||
return s:shellesc_cmd(a:arg)
|
endfunction
|
||||||
|
|
||||||
|
function! s:shellesc_sh(arg)
|
||||||
|
return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Escape the shell argument based on the shell.
|
||||||
|
" Vim and Neovim's shellescape() are insufficient.
|
||||||
|
" 1. shellslash determines whether to use single/double quotes.
|
||||||
|
" Double-quote escaping is fragile for cmd.exe.
|
||||||
|
" 2. It does not work for powershell.
|
||||||
|
" 3. It does not work for *sh shells if the command is executed
|
||||||
|
" via cmd.exe (ie. cmd.exe /c sh -c command command_args)
|
||||||
|
" 4. It does not support batchfile syntax.
|
||||||
|
"
|
||||||
|
" Accepts an optional dictionary with the following keys:
|
||||||
|
" - shell: same as Vim/Neovim 'shell' option.
|
||||||
|
" If unset, fallback to 'cmd.exe' on Windows or 'sh'.
|
||||||
|
" - script: If truthy and shell is cmd.exe, escape for batchfile syntax.
|
||||||
|
function! plug#shellescape(arg, ...)
|
||||||
|
if a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
|
||||||
|
return a:arg
|
||||||
endif
|
endif
|
||||||
return shellescape(a:arg)
|
let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
|
||||||
|
let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
|
||||||
|
let script = get(opts, 'script', 1)
|
||||||
|
if shell =~# 'cmd\(\.exe\)\?$'
|
||||||
|
return s:shellesc_cmd(a:arg, script)
|
||||||
|
elseif s:is_powershell(shell)
|
||||||
|
return s:shellesc_ps1(a:arg)
|
||||||
|
endif
|
||||||
|
return s:shellesc_sh(a:arg)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:glob_dir(path)
|
function! s:glob_dir(path)
|
||||||
@@ -2026,23 +2267,39 @@ function! s:format_message(bullet, name, message)
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:with_cd(cmd, dir)
|
function! s:with_cd(cmd, dir, ...)
|
||||||
return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd)
|
let script = a:0 > 0 ? a:1 : 1
|
||||||
|
return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:system(cmd, ...)
|
function! s:system(cmd, ...)
|
||||||
|
let batchfile = ''
|
||||||
try
|
try
|
||||||
let [sh, shellcmdflag, shrd] = s:chsh(1)
|
let [sh, shellcmdflag, shrd] = s:chsh(1)
|
||||||
let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd
|
if type(a:cmd) == s:TYPE.list
|
||||||
if s:is_win
|
" Neovim's system() supports list argument to bypass the shell
|
||||||
let batchfile = tempname().'.bat'
|
" but it cannot set the working directory for the command.
|
||||||
call writefile(["@echo off\r", cmd . "\r"], batchfile)
|
" Assume that the command does not rely on the shell.
|
||||||
let cmd = batchfile
|
if has('nvim') && a:0 == 0
|
||||||
|
return system(a:cmd)
|
||||||
|
endif
|
||||||
|
let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
|
||||||
|
if s:is_powershell(&shell)
|
||||||
|
let cmd = '& ' . cmd
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let cmd = a:cmd
|
||||||
endif
|
endif
|
||||||
return system(s:is_win ? '('.cmd.')' : cmd)
|
if a:0 > 0
|
||||||
|
let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list)
|
||||||
|
endif
|
||||||
|
if s:is_win && type(a:cmd) != s:TYPE.list
|
||||||
|
let [batchfile, cmd] = s:batchfile(cmd)
|
||||||
|
endif
|
||||||
|
return system(cmd)
|
||||||
finally
|
finally
|
||||||
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
|
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
|
||||||
if s:is_win
|
if s:is_win && filereadable(batchfile)
|
||||||
call delete(batchfile)
|
call delete(batchfile)
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
@@ -2056,18 +2313,17 @@ endfunction
|
|||||||
function! s:git_validate(spec, check_branch)
|
function! s:git_validate(spec, check_branch)
|
||||||
let err = ''
|
let err = ''
|
||||||
if isdirectory(a:spec.dir)
|
if isdirectory(a:spec.dir)
|
||||||
let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir))
|
let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
|
||||||
let remote = result[-1]
|
let remote = result[-1]
|
||||||
if v:shell_error
|
if empty(remote)
|
||||||
let err = join([remote, 'PlugClean required.'], "\n")
|
let err = join([remote, 'PlugClean required.'], "\n")
|
||||||
elseif !s:compare_git_uri(remote, a:spec.uri)
|
elseif !s:compare_git_uri(remote, a:spec.uri)
|
||||||
let err = join(['Invalid URI: '.remote,
|
let err = join(['Invalid URI: '.remote,
|
||||||
\ 'Expected: '.a:spec.uri,
|
\ 'Expected: '.a:spec.uri,
|
||||||
\ 'PlugClean required.'], "\n")
|
\ 'PlugClean required.'], "\n")
|
||||||
elseif a:check_branch && has_key(a:spec, 'commit')
|
elseif a:check_branch && has_key(a:spec, 'commit')
|
||||||
let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir))
|
let sha = s:git_revision(a:spec.dir)
|
||||||
let sha = result[-1]
|
if empty(sha)
|
||||||
if v:shell_error
|
|
||||||
let err = join(add(result, 'PlugClean required.'), "\n")
|
let err = join(add(result, 'PlugClean required.'), "\n")
|
||||||
elseif !s:hash_match(sha, a:spec.commit)
|
elseif !s:hash_match(sha, a:spec.commit)
|
||||||
let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
|
let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
|
||||||
@@ -2075,8 +2331,9 @@ function! s:git_validate(spec, check_branch)
|
|||||||
\ 'PlugUpdate required.'], "\n")
|
\ 'PlugUpdate required.'], "\n")
|
||||||
endif
|
endif
|
||||||
elseif a:check_branch
|
elseif a:check_branch
|
||||||
let branch = result[0]
|
let current_branch = result[0]
|
||||||
" Check tag
|
" Check tag
|
||||||
|
let origin_branch = s:git_origin_branch(a:spec)
|
||||||
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 && a:spec.tag !~ '\*'
|
||||||
@@ -2084,25 +2341,26 @@ function! s:git_validate(spec, check_branch)
|
|||||||
\ (empty(tag) ? 'N/A' : tag), a:spec.tag)
|
\ (empty(tag) ? 'N/A' : tag), a:spec.tag)
|
||||||
endif
|
endif
|
||||||
" Check branch
|
" Check branch
|
||||||
elseif a:spec.branch !=# branch
|
elseif origin_branch !=# current_branch
|
||||||
let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
|
let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
|
||||||
\ branch, a:spec.branch)
|
\ current_branch, origin_branch)
|
||||||
endif
|
endif
|
||||||
if empty(err)
|
if empty(err)
|
||||||
let [ahead, behind] = split(s:lastline(s:system(printf(
|
let [ahead, behind] = split(s:lastline(s:system([
|
||||||
\ 'git rev-list --count --left-right HEAD...origin/%s',
|
\ 'git', 'rev-list', '--count', '--left-right',
|
||||||
\ a:spec.branch), a:spec.dir)), '\t')
|
\ printf('HEAD...origin/%s', origin_branch)
|
||||||
|
\ ], a:spec.dir)), '\t')
|
||||||
if !v:shell_error && ahead
|
if !v:shell_error && ahead
|
||||||
if behind
|
if behind
|
||||||
" Only mention PlugClean if diverged, otherwise it's likely to be
|
" Only mention PlugClean if diverged, otherwise it's likely to be
|
||||||
" pushable (and probably not that messed up).
|
" pushable (and probably not that messed up).
|
||||||
let err = printf(
|
let err = printf(
|
||||||
\ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
|
\ "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)
|
\ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
|
||||||
else
|
else
|
||||||
let err = printf("Ahead of origin/%s by %d commit(s).\n"
|
let err = printf("Ahead of origin/%s by %d commit(s).\n"
|
||||||
\ .'Cannot update until local changes are pushed.',
|
\ .'Cannot update until local changes are pushed.',
|
||||||
\ a:spec.branch, ahead)
|
\ origin_branch, ahead)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@@ -2115,7 +2373,9 @@ endfunction
|
|||||||
|
|
||||||
function! s:rm_rf(dir)
|
function! s:rm_rf(dir)
|
||||||
if isdirectory(a:dir)
|
if isdirectory(a:dir)
|
||||||
call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir))
|
return s:system(s:is_win
|
||||||
|
\ ? 'rmdir /S /Q '.plug#shellescape(a:dir)
|
||||||
|
\ : ['rm', '-rf', a:dir])
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@@ -2147,7 +2407,7 @@ function! s:clean(force)
|
|||||||
|
|
||||||
let allowed = {}
|
let allowed = {}
|
||||||
for dir in dirs
|
for dir in dirs
|
||||||
let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1
|
let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
|
||||||
let allowed[dir] = 1
|
let allowed[dir] = 1
|
||||||
for child in s:glob_dir(dir)
|
for child in s:glob_dir(dir)
|
||||||
let allowed[child] = 1
|
let allowed[child] = 1
|
||||||
@@ -2197,6 +2457,7 @@ endfunction
|
|||||||
function! s:delete(range, force)
|
function! s:delete(range, force)
|
||||||
let [l1, l2] = a:range
|
let [l1, l2] = a:range
|
||||||
let force = a:force
|
let force = a:force
|
||||||
|
let err_count = 0
|
||||||
while l1 <= l2
|
while l1 <= l2
|
||||||
let line = getline(l1)
|
let line = getline(l1)
|
||||||
if line =~ '^- ' && isdirectory(line[2:])
|
if line =~ '^- ' && isdirectory(line[2:])
|
||||||
@@ -2205,11 +2466,22 @@ function! s:delete(range, force)
|
|||||||
let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
|
let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
|
||||||
let force = force || answer > 1
|
let force = force || answer > 1
|
||||||
if answer
|
if answer
|
||||||
call s:rm_rf(line[2:])
|
let err = s:rm_rf(line[2:])
|
||||||
setlocal modifiable
|
setlocal modifiable
|
||||||
call setline(l1, '~'.line[1:])
|
if empty(err)
|
||||||
let s:clean_count += 1
|
call setline(l1, '~'.line[1:])
|
||||||
call setline(4, printf('Removed %d directories.', s:clean_count))
|
let s:clean_count += 1
|
||||||
|
else
|
||||||
|
delete _
|
||||||
|
call append(l1 - 1, s:format_message('x', line[1:], err))
|
||||||
|
let l2 += len(s:lines(err))
|
||||||
|
let err_count += 1
|
||||||
|
endif
|
||||||
|
let msg = printf('Removed %d directories.', s:clean_count)
|
||||||
|
if err_count > 0
|
||||||
|
let msg .= printf(' Failed to remove %d directories.', err_count)
|
||||||
|
endif
|
||||||
|
call setline(4, msg)
|
||||||
setlocal nomodifiable
|
setlocal nomodifiable
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@@ -2220,11 +2492,11 @@ endfunction
|
|||||||
function! s:upgrade()
|
function! s:upgrade()
|
||||||
echo 'Downloading the latest version of vim-plug'
|
echo 'Downloading the latest version of vim-plug'
|
||||||
redraw
|
redraw
|
||||||
let tmp = tempname()
|
let tmp = s:plug_tempname()
|
||||||
let new = tmp . '/plug.vim'
|
let new = tmp . '/plug.vim'
|
||||||
|
|
||||||
try
|
try
|
||||||
let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp))
|
let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp])
|
||||||
if v:shell_error
|
if v:shell_error
|
||||||
return s:err('Error upgrading vim-plug: '. out)
|
return s:err('Error upgrading vim-plug: '. out)
|
||||||
endif
|
endif
|
||||||
@@ -2365,18 +2637,17 @@ 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
|
||||||
|
let batchfile = ''
|
||||||
try
|
try
|
||||||
let [sh, shellcmdflag, shrd] = s:chsh(1)
|
let [sh, shellcmdflag, shrd] = s:chsh(1)
|
||||||
let cmd = 'cd '.s:shellesc(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
|
let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
|
||||||
if s:is_win
|
if s:is_win
|
||||||
let batchfile = tempname().'.bat'
|
let [batchfile, cmd] = s:batchfile(cmd)
|
||||||
call writefile(["@echo off\r", cmd . "\r"], batchfile)
|
|
||||||
let cmd = batchfile
|
|
||||||
endif
|
endif
|
||||||
execute 'silent %!' cmd
|
execute 'silent %!' cmd
|
||||||
finally
|
finally
|
||||||
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
|
let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
|
||||||
if s:is_win
|
if s:is_win && filereadable(batchfile)
|
||||||
call delete(batchfile)
|
call delete(batchfile)
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
@@ -2419,12 +2690,23 @@ function! s:diff()
|
|||||||
endif
|
endif
|
||||||
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 branch = s:git_origin_branch(v)
|
||||||
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)
|
if len(branch)
|
||||||
if !empty(diff)
|
let range = origin ? '..origin/'.branch : 'HEAD@{1}..'
|
||||||
let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
|
let cmd = ['git', 'log', '--graph', '--color=never']
|
||||||
call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
|
if s:git_version_requirement(2, 10, 0)
|
||||||
let cnts[origin] += 1
|
call add(cmd, '--no-show-signature')
|
||||||
|
endif
|
||||||
|
call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range])
|
||||||
|
if has_key(v, 'rtp')
|
||||||
|
call extend(cmd, ['--', v.rtp])
|
||||||
|
endif
|
||||||
|
let diff = s:system_chomp(cmd, v.dir)
|
||||||
|
if !empty(diff)
|
||||||
|
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)')))
|
||||||
|
let cnts[origin] += 1
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
let bar .= '='
|
let bar .= '='
|
||||||
call s:progress_bar(2, bar, len(total))
|
call s:progress_bar(2, bar, len(total))
|
||||||
@@ -2466,7 +2748,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 '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
|
||||||
setlocal modifiable
|
setlocal modifiable
|
||||||
normal! "_dap
|
normal! "_dap
|
||||||
setlocal nomodifiable
|
setlocal nomodifiable
|
||||||
@@ -2486,7 +2768,7 @@ function! s:snapshot(force, ...) abort
|
|||||||
let names = sort(keys(filter(copy(g:plugs),
|
let names = sort(keys(filter(copy(g:plugs),
|
||||||
\'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
|
\'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
|
||||||
for name in reverse(names)
|
for name in reverse(names)
|
||||||
let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir)
|
let sha = s:git_revision(g:plugs[name].dir)
|
||||||
if !empty(sha)
|
if !empty(sha)
|
||||||
call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
|
call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
|
||||||
redraw
|
redraw
|
||||||
@@ -2494,7 +2776,7 @@ function! s:snapshot(force, ...) abort
|
|||||||
endfor
|
endfor
|
||||||
|
|
||||||
if a:0 > 0
|
if a:0 > 0
|
||||||
let fn = expand(a:1)
|
let fn = s:plug_expand(a:1)
|
||||||
if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
|
if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|||||||
41
test/functional.vader
Normal file
41
test/functional.vader
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
Execute (plug#shellescape() works without optional arguments):
|
||||||
|
if has('unix')
|
||||||
|
AssertEqual "''", plug#shellescape("")
|
||||||
|
AssertEqual "'foo'\\'''", plug#shellescape("foo'")
|
||||||
|
endif
|
||||||
|
|
||||||
|
Execute (plug#shellescape() ignores invalid optional argument):
|
||||||
|
if has('unix')
|
||||||
|
AssertEqual "''", plug#shellescape("", '')
|
||||||
|
AssertEqual "'foo'\\'''", plug#shellescape("foo'", [])
|
||||||
|
endif
|
||||||
|
|
||||||
|
Execute (plug#shellescape() depends on the shell):
|
||||||
|
AssertEqual "'foo'\\'''", plug#shellescape("foo'", {'shell': 'sh'})
|
||||||
|
AssertEqual '^"foo''^"', plug#shellescape("foo'", {'shell': 'cmd.exe'})
|
||||||
|
AssertEqual "'foo'''", plug#shellescape("foo'", {'shell': 'powershell'})
|
||||||
|
AssertEqual "'foo'''", plug#shellescape("foo'", {'shell': 'powershell.exe'})
|
||||||
|
AssertEqual "'foo'''", plug#shellescape("foo'", {'shell': 'pwsh'})
|
||||||
|
|
||||||
|
Execute (plug#shellescape() supports non-trivial cmd.exe escaping):
|
||||||
|
" batchfile
|
||||||
|
AssertEqual '^"^^%%PATH^^%%^"', plug#shellescape("^%PATH^%", {
|
||||||
|
\ 'shell': 'cmd.exe',
|
||||||
|
\ })
|
||||||
|
AssertEqual '^"^^%%PATH^^%%^"', plug#shellescape("^%PATH^%", {
|
||||||
|
\ 'shell': 'cmd.exe',
|
||||||
|
\ 'script': 1,
|
||||||
|
\ })
|
||||||
|
" command prompt
|
||||||
|
AssertEqual '^"^^^%PATH^^^%^"', plug#shellescape("^%PATH^%", {
|
||||||
|
\ 'shell': 'cmd.exe',
|
||||||
|
\ 'script': 0,
|
||||||
|
\ }),
|
||||||
|
|
||||||
|
Execute (plug#shellescape() supports non-trivial powershell.exe escaping):
|
||||||
|
AssertEqual '''\"Foo\\''''\\Bar\"''', plug#shellescape('"Foo\''\Bar"', {
|
||||||
|
\ 'shell': 'powershell',
|
||||||
|
\ }),
|
||||||
|
AssertEqual '''\"Foo\\''''\\Bar\"''', plug#shellescape('"Foo\''\Bar"', {
|
||||||
|
\ 'shell': 'powershell.exe',
|
||||||
|
\ }),
|
||||||
13
test/run
13
test/run
@@ -91,6 +91,11 @@ DOC
|
|||||||
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"
|
||||||
|
|
||||||
|
chmod +w "$PLUG_FIXTURES/cant-delete/autoload" || rm -rf "$PLUG_FIXTURES/cant-delete"
|
||||||
|
mkdir -p "$PLUG_FIXTURES/cant-delete/autoload"
|
||||||
|
touch "$PLUG_FIXTURES/cant-delete/autoload/cant-delete.vim"
|
||||||
|
chmod -w "$PLUG_FIXTURES/cant-delete/autoload"
|
||||||
|
|
||||||
rm -rf $TEMP/new-branch
|
rm -rf $TEMP/new-branch
|
||||||
cd $TEMP
|
cd $TEMP
|
||||||
git init new-branch
|
git init new-branch
|
||||||
@@ -122,9 +127,11 @@ 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 &&
|
FAIL=0
|
||||||
prepare &&
|
$vim -Nu $TEMP/mini-vimrc -c 'Vader! test.vader' > /dev/null || FAIL=1
|
||||||
$vim -Nu $TEMP/mini-vimrc -c 'let g:plug_threads = 1 | Vader! test.vader' > /dev/null
|
prepare
|
||||||
|
$vim -Nu $TEMP/mini-vimrc -c 'let g:plug_threads = 1 | Vader! test.vader' > /dev/null || FAIL=1
|
||||||
|
test $FAIL -eq 0
|
||||||
else
|
else
|
||||||
$vim -Nu $TEMP/mini-vimrc -c 'Vader test.vader'
|
$vim -Nu $TEMP/mini-vimrc -c 'Vader test.vader'
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -18,10 +18,6 @@ Execute (Initialize test environment):
|
|||||||
\ ['function! ResetPlug()', 'let s:loaded = {}', 'endfunction',
|
\ ['function! ResetPlug()', 'let s:loaded = {}', 'endfunction',
|
||||||
\ 'function! CompareURI(a, b)', 'return s:compare_git_uri(a:a, a:b)', 'endfunction']
|
\ 'function! CompareURI(a, b)', 'return s:compare_git_uri(a:a, a:b)', 'endfunction']
|
||||||
|
|
||||||
if $ENV != 'vim8'
|
|
||||||
call add(patch, 'let s:vim8 = 0')
|
|
||||||
endif
|
|
||||||
|
|
||||||
call writefile(extend(readfile($PLUG_TMP), patch), $PLUG_TMP)
|
call writefile(extend(readfile($PLUG_TMP), patch), $PLUG_TMP)
|
||||||
|
|
||||||
set t_Co=256
|
set t_Co=256
|
||||||
@@ -90,6 +86,7 @@ Execute (Print Interpreter Version):
|
|||||||
|
|
||||||
Include: workflow.vader
|
Include: workflow.vader
|
||||||
Include: regressions.vader
|
Include: regressions.vader
|
||||||
|
Include: functional.vader
|
||||||
|
|
||||||
Execute (Cleanup):
|
Execute (Cleanup):
|
||||||
silent! call RmRf(g:temp_plugged)
|
silent! call RmRf(g:temp_plugged)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Execute (plug#end() before plug#begin() should fail):
|
|||||||
redir => out
|
redir => out
|
||||||
silent! AssertEqual 0, plug#end()
|
silent! AssertEqual 0, plug#end()
|
||||||
redir END
|
redir END
|
||||||
Assert stridx(out, 'Call plug#begin() first') >= 0
|
Assert stridx(out, 'plug#end() called without calling plug#begin() first') >= 0
|
||||||
|
|
||||||
Execute (plug#begin() without path argument):
|
Execute (plug#begin() without path argument):
|
||||||
call plug#begin()
|
call plug#begin()
|
||||||
@@ -49,24 +49,32 @@ Execute (Test Plug command):
|
|||||||
AssertEqual 'no-t_co', g:plugs['seoul256.vim'].branch
|
AssertEqual 'no-t_co', g:plugs['seoul256.vim'].branch
|
||||||
|
|
||||||
^ Git repo with tag (DEPRECATED. USE TAG OPTION)
|
^ Git repo with tag (DEPRECATED. USE TAG OPTION)
|
||||||
|
redir => out
|
||||||
|
silent Plug 'foo/bar.vim', ''
|
||||||
|
redir END
|
||||||
|
Assert out =~ 'Invalid argument for "tag" option of :Plug (expected: string)'
|
||||||
Plug 'junegunn/goyo.vim', '1.5.2'
|
Plug 'junegunn/goyo.vim', '1.5.2'
|
||||||
AssertEqual 'file:///tmp/vim-plug-test/junegunn/goyo.vim', g:plugs['goyo.vim'].uri
|
AssertEqual 'file:///tmp/vim-plug-test/junegunn/goyo.vim', g:plugs['goyo.vim'].uri
|
||||||
AssertEqual join([g:temp_plugged, 'goyo.vim/'], '/'), g:plugs['goyo.vim'].dir
|
AssertEqual join([g:temp_plugged, 'goyo.vim/'], '/'), g:plugs['goyo.vim'].dir
|
||||||
AssertEqual '1.5.2', g:plugs['goyo.vim'].tag
|
AssertEqual '1.5.2', g:plugs['goyo.vim'].tag
|
||||||
|
|
||||||
|
redir => out
|
||||||
|
silent Plug 'foo/bar.vim', {'tag': ''}
|
||||||
|
redir END
|
||||||
|
Assert out =~ 'Invalid argument for "tag" option of :Plug (expected: string)'
|
||||||
Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' } " Using tag option
|
Plug 'junegunn/goyo.vim', { 'tag': '1.5.3' } " Using tag option
|
||||||
AssertEqual '1.5.3', g:plugs['goyo.vim'].tag
|
AssertEqual '1.5.3', g:plugs['goyo.vim'].tag
|
||||||
|
|
||||||
" Git URI
|
" Git URI
|
||||||
Plug 'file:///tmp/vim-plug-test/jg/vim-emoji'
|
Plug 'file:///tmp/vim-plug-test/jg/vim-emoji'
|
||||||
AssertEqual 'file:///tmp/vim-plug-test/jg/vim-emoji', g:plugs['vim-emoji'].uri
|
AssertEqual 'file:///tmp/vim-plug-test/jg/vim-emoji', g:plugs['vim-emoji'].uri
|
||||||
AssertEqual 'master', g:plugs['vim-emoji'].branch
|
AssertEqual '', g:plugs['vim-emoji'].branch
|
||||||
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 'vim-scripts/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 '', g:plugs.beauty256.branch
|
||||||
|
|
||||||
AssertEqual 4, len(g:plugs)
|
AssertEqual 4, len(g:plugs)
|
||||||
|
|
||||||
@@ -77,6 +85,26 @@ Execute (Test Plug command):
|
|||||||
|
|
||||||
Execute (Plug command with dictionary option):
|
Execute (Plug command with dictionary option):
|
||||||
Log string(g:plugs)
|
Log string(g:plugs)
|
||||||
|
for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
|
||||||
|
let opts = {}
|
||||||
|
let opts[opt] = ''
|
||||||
|
redir => out
|
||||||
|
silent Plug 'foo/bar.vim', opts
|
||||||
|
redir END
|
||||||
|
Assert out =~ 'Invalid argument for "'.opt.'" option of :Plug (expected: string)'
|
||||||
|
endfor
|
||||||
|
for opt in ['on', 'for']
|
||||||
|
let opts = {}
|
||||||
|
let opts[opt] = ''
|
||||||
|
redir => out
|
||||||
|
silent Plug 'foo/bar.vim', opts
|
||||||
|
redir END
|
||||||
|
Assert out =~ 'Invalid argument for "'.opt.'" option of :Plug (expected: string or list)'
|
||||||
|
endfor
|
||||||
|
redir => out
|
||||||
|
silent Plug 'foo/bar.vim', {'do': ''}
|
||||||
|
redir END
|
||||||
|
Assert out =~ 'Invalid argument for "do" option of :Plug (expected: string or funcref)'
|
||||||
Plug 'junegunn/seoul256.vim', { 'branch': 'no-t_co', 'rtp': '././' }
|
Plug 'junegunn/seoul256.vim', { 'branch': 'no-t_co', 'rtp': '././' }
|
||||||
AssertEqual join([g:temp_plugged, 'seoul256.vim/'], '/'), g:plugs['seoul256.vim'].dir
|
AssertEqual join([g:temp_plugged, 'seoul256.vim/'], '/'), g:plugs['seoul256.vim'].dir
|
||||||
AssertEqual '././', g:plugs['seoul256.vim'].rtp
|
AssertEqual '././', g:plugs['seoul256.vim'].rtp
|
||||||
@@ -354,6 +382,7 @@ Execute (New commits on remote, PlugUpdate, then PlugDiff):
|
|||||||
" Now we have updates
|
" Now we have updates
|
||||||
normal D
|
normal D
|
||||||
AssertEqual '2 plugin(s) updated.', getline(1)
|
AssertEqual '2 plugin(s) updated.', getline(1)
|
||||||
|
AssertThrows execute('/gpg')
|
||||||
|
|
||||||
" Preview commit
|
" Preview commit
|
||||||
silent! wincmd P
|
silent! wincmd P
|
||||||
@@ -399,13 +428,17 @@ Execute (New commits on remote, PlugUpdate, then PlugDiff):
|
|||||||
execute "normal Xy\<cr>"
|
execute "normal Xy\<cr>"
|
||||||
AssertExpect '^- ', 1
|
AssertExpect '^- ', 1
|
||||||
|
|
||||||
" q will close preview window as well
|
" q will only close preview window
|
||||||
normal q
|
normal q
|
||||||
|
|
||||||
" We no longer have preview window
|
" We no longer have preview window
|
||||||
silent! wincmd P
|
silent! wincmd P
|
||||||
AssertEqual 0, &previewwindow
|
AssertEqual 0, &previewwindow
|
||||||
|
|
||||||
|
" And we're still on main vim-plug window
|
||||||
|
AssertEqual 'vim-plug', &filetype
|
||||||
|
normal q
|
||||||
|
|
||||||
" q should not close preview window if it's already open
|
" q should not close preview window if it's already open
|
||||||
pedit
|
pedit
|
||||||
PlugDiff
|
PlugDiff
|
||||||
@@ -430,6 +463,11 @@ Execute (Test g:plug_pwindow):
|
|||||||
AssertEqual 2, winnr()
|
AssertEqual 2, winnr()
|
||||||
AssertEqual 5, winheight('.')
|
AssertEqual 5, winheight('.')
|
||||||
wincmd p
|
wincmd p
|
||||||
|
|
||||||
|
" Close preview window
|
||||||
|
normal q
|
||||||
|
|
||||||
|
" Close main window
|
||||||
normal q
|
normal q
|
||||||
unlet g:plug_pwindow
|
unlet g:plug_pwindow
|
||||||
|
|
||||||
@@ -537,6 +575,51 @@ Execute (PlugDiff):
|
|||||||
Assert !empty(mapcheck("\<cr>"))
|
Assert !empty(mapcheck("\<cr>"))
|
||||||
q
|
q
|
||||||
|
|
||||||
|
Execute (Do not show diff for commits outside of rtp):
|
||||||
|
call plug#begin()
|
||||||
|
call plug#end()
|
||||||
|
PlugClean!
|
||||||
|
|
||||||
|
call plug#begin()
|
||||||
|
Plug 'file://'.expand('$PLUG_FIXTURES').'/xxx'
|
||||||
|
Plug 'file://'.expand('$PLUG_FIXTURES').'/yyy', { 'rtp': 'rtp' }
|
||||||
|
call plug#end()
|
||||||
|
PlugInstall
|
||||||
|
Log getline(1, '$')
|
||||||
|
|
||||||
|
call system('cd "$PLUG_FIXTURES/xxx" && git commit --allow-empty -m update-xxx && git tag -f xxx')
|
||||||
|
call system('cd "$PLUG_FIXTURES/yyy" && git commit --allow-empty -m update-yyy && git tag -f yyy')
|
||||||
|
|
||||||
|
let g:plugs.yyy.tag = 'yyy'
|
||||||
|
PlugUpdate
|
||||||
|
Log getline(1, '$')
|
||||||
|
|
||||||
|
PlugDiff
|
||||||
|
" 1 plugin(s) updated.
|
||||||
|
" [==]
|
||||||
|
"
|
||||||
|
" Last update:
|
||||||
|
" ------------
|
||||||
|
"
|
||||||
|
" - xxx:
|
||||||
|
" * 7faa9b2 update-xxx (0 seconds ago)
|
||||||
|
"
|
||||||
|
" Pending updates:
|
||||||
|
" ----------------
|
||||||
|
"
|
||||||
|
" N/A
|
||||||
|
"
|
||||||
|
Log getline(1, '$')
|
||||||
|
AssertEqual 14, line('$')
|
||||||
|
AssertEqual '1 plugin(s) updated.', getline(1)
|
||||||
|
AssertEqual '[==]', getline(2)
|
||||||
|
AssertEqual 'Last update:', getline(4)
|
||||||
|
AssertEqual '- xxx:', getline(7)
|
||||||
|
Assert !empty(mapcheck('o'))
|
||||||
|
Assert !empty(mapcheck('X'))
|
||||||
|
Assert !empty(mapcheck("\<cr>"))
|
||||||
|
q
|
||||||
|
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
~ On-demand loading / Partial installation/update ~
|
~ On-demand loading / Partial installation/update ~
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
@@ -991,9 +1074,10 @@ Execute (Post-update hook output; success and failure):
|
|||||||
|
|
||||||
Execute (Post-update hook output; invalid type or funcref):
|
Execute (Post-update hook output; invalid type or funcref):
|
||||||
call plug#begin()
|
call plug#begin()
|
||||||
Plug 'junegunn/vim-easy-align', { 'do': 1 }
|
Plug 'junegunn/vim-easy-align', { 'do': ':echo 1' }
|
||||||
Plug 'junegunn/vim-pseudocl', { 'do': function('call') }
|
Plug 'junegunn/vim-pseudocl', { 'do': function('call') }
|
||||||
call plug#end()
|
call plug#end()
|
||||||
|
let g:plugs['vim-easy-align'].do = 1
|
||||||
|
|
||||||
silent PlugInstall! 1
|
silent PlugInstall! 1
|
||||||
AssertEqual 'x Post-update hook for vim-pseudocl ... Vim(call):E119: Not enough arguments for function: call', getline(5)
|
AssertEqual 'x Post-update hook for vim-pseudocl ... Vim(call):E119: Not enough arguments for function: call', getline(5)
|
||||||
@@ -1397,6 +1481,7 @@ Execute (PlugClean should not try to remove unmanaged plugins inside g:plug_home
|
|||||||
Plug '$PLUG_FIXTURES/fzf'
|
Plug '$PLUG_FIXTURES/fzf'
|
||||||
Plug '$PLUG_FIXTURES/xxx'
|
Plug '$PLUG_FIXTURES/xxx'
|
||||||
Plug '$PLUG_FIXTURES/yyy'
|
Plug '$PLUG_FIXTURES/yyy'
|
||||||
|
Plug '$PLUG_FIXTURES/cant-delete'
|
||||||
call plug#end()
|
call plug#end()
|
||||||
|
|
||||||
" Remove z1, z2
|
" Remove z1, z2
|
||||||
@@ -1650,3 +1735,25 @@ Execute (#766 - Allow cloning into an empty directory):
|
|||||||
AssertExpect! '[=]', 1
|
AssertExpect! '[=]', 1
|
||||||
q
|
q
|
||||||
unlet d
|
unlet d
|
||||||
|
|
||||||
|
Execute (#982 - PlugClean should report when directories cannot be removed):
|
||||||
|
call plug#begin('$PLUG_FIXTURES')
|
||||||
|
Plug '$PLUG_FIXTURES/ftplugin-msg', { 'for': [] }
|
||||||
|
Plug '$PLUG_FIXTURES/fzf'
|
||||||
|
Plug '$PLUG_FIXTURES/xxx'
|
||||||
|
Plug '$PLUG_FIXTURES/yyy'
|
||||||
|
call plug#end()
|
||||||
|
|
||||||
|
" Fail to remove cant-delete
|
||||||
|
PlugClean!
|
||||||
|
AssertEqual 'Removed 0 directories. Failed to remove 1 directories.', getline(4)
|
||||||
|
AssertExpect '^x ', 1
|
||||||
|
q
|
||||||
|
|
||||||
|
" Delete tmp but fail to remove cant-delete
|
||||||
|
call mkdir(expand('$PLUG_FIXTURES/tmp'))
|
||||||
|
PlugClean!
|
||||||
|
AssertEqual 'Removed 1 directories. Failed to remove 1 directories.', getline(4)
|
||||||
|
AssertExpect '^x ', 1
|
||||||
|
AssertExpect '^\~ ', 1
|
||||||
|
q
|
||||||
|
|||||||
Reference in New Issue
Block a user