From e07c18608f444cc3ecac72ca8a537453b2d1e042 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 3 Feb 2024 19:51:21 +0900 Subject: [PATCH 01/12] Add Lua configuration example Close #1258 --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/README.md b/README.md index 2602467..ce7c239 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,53 @@ call plug#end() Reload .vimrc and `:PlugInstall` to install plugins. +#### Example (Lua configuration file for Neovim) + +In Neovim, you can write your configuration in a Lua script file named +`init.lua`. The following code is the Lua script equivalent to the VimScript +example above. + +```lua +local vim = vim +local Plug = vim.fn['plug#'] + +vim.call('plug#begin') + +-- Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +Plug('junegunn/vim-easy-align') + +-- Any valid git URL is allowed +Plug('https://github.com/junegunn/vim-github-dashboard.git') + +-- Multiple Plug commands can be written in a single line using ; separators +Plug('SirVer/ultisnips'); Plug('honza/vim-snippets') + +-- On-demand loading +Plug('preservim/nerdtree', { ['on'] = 'NERDTreeToggle' }) +Plug('tpope/vim-fireplace', { ['for'] = 'clojure' }) + +-- Using a non-default branch +Plug('rdnetto/YCM-Generator', { ['branch'] = 'stable' }) + +-- Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +Plug('fatih/vim-go', { ['tag'] = '*' }) + +-- Plugin options +Plug('nsf/gocode', { ['tag'] = 'v.20150303', ['rtp'] = 'vim' }) + +-- Plugin outside ~/.vim/plugged with post-update hook +Plug('junegunn/fzf', { ['dir'] = '~/.fzf', ['do'] = './install --all' }) + +-- Unmanaged plugin (manually installed and updated) +Plug('~/my-prototype-plugin') + +vim.call('plug#end') +``` + +More examples can be found in: + +* https://gitlab.com/sultanahamer/dotfiles/-/blob/master/nvim/lua/plugins.lua?ref_type=heads + ### Commands | Command | Description | From 6dd068e8d8855fcae21ceb06d1f6e3f06c3c8f88 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 3 Feb 2024 20:05:06 +0900 Subject: [PATCH 02/12] Tidy up --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ce7c239..27c932f 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ call plug#end() Reload .vimrc and `:PlugInstall` to install plugins. -#### Example (Lua configuration file for Neovim) +#### Example (Lua configuration for Neovim) In Neovim, you can write your configuration in a Lua script file named `init.lua`. The following code is the Lua script equivalent to the VimScript From ade078e362b3bc9144d190046798a22d7cae9624 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 13 Feb 2024 08:45:04 +0900 Subject: [PATCH 03/12] Update README: warp.dev --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 27c932f..4d1b915 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ +
+Special thanks to: +
+
+ +
+ Warp +
+ Warp is a modern, Rust-based terminal with AI built in so you and your team can build great software, faster. +
+ Visit warp.dev to learn more. +
+
+
+
+
+
+ vim-plug[![build](https://img.shields.io/github/actions/workflow/status/junegunn/vim-plug/test.yml?branch=master)](https://github.com/junegunn/vim-plug/actions/workflows/test.yml?query=branch%3Amaster) === From eee20c7e795c9268ce36cb30adb66711af868941 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 15 Feb 2024 14:29:41 +0900 Subject: [PATCH 04/12] Update README: warp.dev --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d1b915..6c4f77e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Special thanks to:

- +
Warp
From 6154433e228f9cdc3ed607d66ab399a5aa7b5739 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Fri, 23 Feb 2024 01:14:44 +0900 Subject: [PATCH 05/12] README: Lambda expression as post-update hook --- README.md | 21 +++++++++++++-------- doc/plug.txt | 17 +++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 6c4f77e..602e585 100644 --- a/README.md +++ b/README.md @@ -311,8 +311,14 @@ If the value starts with `:`, it will be recognized as a Vim command. Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' } ``` +To call a Vim function, you can pass a lambda expression like so: + +```vim +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +``` + If you need more control, you can pass a reference to a Vim function that -takes a single argument. +takes a dictionary argument. ```vim function! BuildYCM(info) @@ -328,14 +334,13 @@ endfunction Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') } ``` -Both forms of post-update hook are executed inside the directory of the plugin -and only run when the repository has changed, but you can force it to run -unconditionally with the bang-versions of the commands: `PlugInstall!` and -`PlugUpdate!`. +A post-update hook is executed inside the directory of the plugin and only run +when the repository has changed, but you can force it to run unconditionally +with the bang-versions of the commands: `PlugInstall!` and `PlugUpdate!`. -Make sure to escape BARs and double-quotes when you write the `do` option inline -as they are mistakenly recognized as command separator or the start of the -trailing comment. +Make sure to escape BARs and double-quotes when you write the `do` option +inline as they are mistakenly recognized as command separator or the start of +the trailing comment. ```vim Plug 'junegunn/fzf', { 'do': 'yes \| ./install' } diff --git a/doc/plug.txt b/doc/plug.txt index e4131c1..3cad4f9 100644 --- a/doc/plug.txt +++ b/doc/plug.txt @@ -1,4 +1,4 @@ -plug.txt plug Last change: January 19 2023 +plug.txt plug Last change: February 23 2024 PLUG - TABLE OF CONTENTS *plug* *plug-toc* ============================================================================== @@ -297,13 +297,15 @@ In that case, use the `do` option to describe the task to be performed. Plug 'ycm-core/YouCompleteMe', { 'do': './install.py' } < If the value starts with `:`, it will be recognized as a Vim command. - - *:GoInstallBinaries* > Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' } < +To call a Vim function, you can pass a lambda expression like so: +> + Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +< If you need more control, you can pass a reference to a Vim function that -takes a single argument. +takes a dictionary argument. > function! BuildYCM(info) " info is a dictionary with 3 fields @@ -317,10 +319,9 @@ takes a single argument. Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') } < -Both forms of post-update hook are executed inside the directory of the plugin -and only run when the repository has changed, but you can force it to run -unconditionally with the bang-versions of the commands: `PlugInstall!` and -`PlugUpdate!`. +A post-update hook is executed inside the directory of the plugin and only run +when the repository has changed, but you can force it to run unconditionally +with the bang-versions of the commands: `PlugInstall!` and `PlugUpdate!`. Make sure to escape BARs and double-quotes when you write the `do` option inline as they are mistakenly recognized as command separator or the start of From 64b9f9e3c3eadfabe4b0cb4bf27977665081b939 Mon Sep 17 00:00:00 2001 From: Jongwook Choi Date: Sun, 6 Feb 2022 14:15:10 -0500 Subject: [PATCH 06/12] Source lua files (if any) from rtp when loading a plugin Neovim 0.5.0 allows lua files to be used in runtime files (such as plugin, ftdetect, etc.) as well as vimscript files. Indeed, some plugins have `plugin/*.lua` scripts only, but not `plugin/*.vim`; such plugins cannot be sourced and work properly if it is lazy-loaded. --- plug.vim | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plug.vim b/plug.vim index 9c3011f..62e314d 100644 --- a/plug.vim +++ b/plug.vim @@ -391,6 +391,9 @@ function! plug#end() if !empty(types) augroup filetypedetect call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + if has('nvim-0.5.0') + call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua') + endif augroup END endif for type in types @@ -438,6 +441,9 @@ endfunction function! s:load_plugin(spec) call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') + if has('nvim-0.5.0') + call s:source(s:rtp(a:spec), 'plugin/**/*.lua', 'after/plugin/**/*.lua') + endif endfunction function! s:reload_plugins() @@ -655,6 +661,9 @@ function! s:lod(names, types, ...) let rtp = s:rtp(g:plugs[name]) for dir in a:types call s:source(rtp, dir.'/**/*.vim') + if has('nvim-0.5.0') " see neovim#14686 + call s:source(rtp, dir.'/**/*.lua') + endif endfor if a:0 if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) From 3264b81e7a53a3e30d6e88ecbb9aff513781e357 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 13 Nov 2023 19:53:19 +0900 Subject: [PATCH 07/12] Update plug.vim --- plug.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plug.vim b/plug.vim index 62e314d..a4901e4 100644 --- a/plug.vim +++ b/plug.vim @@ -392,7 +392,7 @@ function! plug#end() augroup filetypedetect call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') if has('nvim-0.5.0') - call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua') + call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua') endif augroup END endif From 2f8f04cf79f424aab8c2372d8e0b89099e3dba65 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 24 Feb 2024 23:02:38 +0900 Subject: [PATCH 08/12] Reset &rtp before 'do' to invalidate Neovim cache of loaded Lua modules --- plug.vim | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plug.vim b/plug.vim index a4901e4..71486bc 100644 --- a/plug.vim +++ b/plug.vim @@ -1040,6 +1040,11 @@ function! s:is_updated(dir) endfunction function! s:do(pull, force, todo) + if has('nvim') + " Reset &rtp to invalidate Neovim cache of loaded Lua modules + " See https://github.com/junegunn/vim-plug/pull/1157#issuecomment-1809226110 + let &rtp = &rtp + endif for [name, spec] in items(a:todo) if !isdirectory(spec.dir) continue From e2974a33679cce8927bdefc6dc74da35f29a3d03 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 5 Mar 2024 16:13:23 +0900 Subject: [PATCH 09/12] Fix PlugClean error when the default branch has changed (#1269) Fix #1253 --- plug.vim | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/plug.vim b/plug.vim index 71486bc..bb00a7d 100644 --- a/plug.vim +++ b/plug.vim @@ -2360,18 +2360,21 @@ function! s:git_validate(spec, check_branch) \ current_branch, origin_branch) endif if empty(err) - let [ahead, behind] = split(s:lastline(s:system([ - \ 'git', 'rev-list', '--count', '--left-right', - \ printf('HEAD...origin/%s', origin_branch) - \ ], a:spec.dir)), '\t') - if !v:shell_error && ahead - if behind + let ahead_behind = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', origin_branch) + \ ], a:spec.dir)), '\t') + if v:shell_error || len(ahead_behind) != 2 + let err = "Failed to compare with the origin. The default branch might have changed.\nPlugClean required." + else + let [ahead, behind] = ahead_behind + if ahead && behind " Only mention PlugClean if diverged, otherwise it's likely to be " pushable (and probably not that messed up). let err = printf( \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) - else + elseif ahead let err = printf("Ahead of origin/%s by %d commit(s).\n" \ .'Cannot update until local changes are pushed.', \ origin_branch, ahead) From ed19478ce2cf5877e1619a93ab277645a0e89f2c Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 7 Mar 2024 00:18:49 +0900 Subject: [PATCH 10/12] Keep track of the default branch of the origin (#1272) Fix #1005 vim-plug will now run `git remote set-head origin -a` on PlugUpdate to keep track of the default branch of the origin, so that it can still update a plugin even if its default branch has changed. This additional command will slow down the update process, but this is an unavoidable price to pay for the correctness of the task. However, vim-plug will run checkout and merge commands in parallel, so this improvement will slightly offset the slowdown. --- plug.vim | 88 ++++++++++++++++++++++++++++++--------------- test/workflow.vader | 3 +- 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/plug.vim b/plug.vim index bb00a7d..f9827bc 100644 --- a/plug.vim +++ b/plug.vim @@ -1106,12 +1106,14 @@ endfunction function! s:checkout(spec) let sha = a:spec.commit let output = s:git_revision(a:spec.dir) + let error = 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( \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + let error = v:shell_error endif - return output + return [output, error] endfunction function! s:finish(pull) @@ -1172,7 +1174,7 @@ function! s:update_impl(pull, force, args) abort let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? \ remove(args, -1) : get(g:, 'plug_threads', 16) - let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let managed = filter(deepcopy(g:plugs), 's:is_managed(v:key)') let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : \ filter(managed, 'index(args, v:key) >= 0') @@ -1306,9 +1308,11 @@ function! s:update_finish() if !pos continue endif + let out = '' + let error = 0 if has_key(spec, 'commit') call s:log4(name, 'Checking out '.spec.commit) - let out = s:checkout(spec) + let [out, error] = s:checkout(spec) elseif has_key(spec, 'tag') let tag = spec.tag if tag =~ '\*' @@ -1321,19 +1325,16 @@ function! s:update_finish() endif call s:log4(name, 'Checking out '.tag) let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) - else - let branch = s:git_origin_branch(spec) - call s:log4(name, 'Merging origin/'.s:esc(branch)) - let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' - \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + let error = v:shell_error endif - if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + if !error && filereadable(spec.dir.'/.gitmodules') && \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) call s:log4(name, 'Updating submodules. This may take a while.') let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + let error = v:shell_error endif let msg = s:format_message(v:shell_error ? 'x': '-', name, out) - if v:shell_error + if error call add(s:update.errors, name) call s:regress_bar() silent execute pos 'd _' @@ -1396,7 +1397,9 @@ function! s:job_out_cb(self, data) abort if !self.running || self.tick % len(s:jobs) == 0 let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) - call s:log(bullet, self.name, result) + if len(result) + call s:log(bullet, self.name, result) + endif endif endfunction @@ -1420,16 +1423,17 @@ function! s:nvim_cb(job_id, data, event) dict abort \ s:job_cb('s:job_exit_cb', self, 0, a:data) endfunction -function! s:spawn(name, cmd, opts) - let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], - \ 'new': get(a:opts, 'new', 0) } +function! s:spawn(name, spec, queue, opts) + let job = { 'name': a:name, 'spec': a:spec, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0), 'queue': copy(a:queue) } + let Item = remove(job.queue, 0) + let argv = type(Item) == s:TYPE.funcref ? call(Item, [a:spec]) : Item let s:jobs[a:name] = job if s:nvim if has_key(a:opts, 'dir') let job.cwd = a:opts.dir endif - let argv = a:cmd call extend(job, { \ 'on_stdout': function('s:nvim_cb'), \ 'on_stderr': function('s:nvim_cb'), @@ -1445,7 +1449,7 @@ function! s:spawn(name, cmd, opts) \ 'Invalid arguments (or job table is full)'] endif elseif s:vim8 - let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + let cmd = join(map(copy(argv), 'plug#shellescape(v:val, {"script": 0})')) if has_key(a:opts, 'dir') let cmd = s:with_cd(cmd, a:opts.dir, 0) endif @@ -1465,27 +1469,34 @@ function! s:spawn(name, cmd, opts) let job.lines = ['Failed to start job'] endif else - let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [argv, a:opts.dir] : [argv])) let job.error = v:shell_error != 0 let job.running = 0 endif endfunction function! s:reap(name) - let job = s:jobs[a:name] + let job = remove(s:jobs, a:name) if job.error call add(s:update.errors, a:name) elseif get(job, 'new', 0) let s:update.new[a:name] = 1 endif - let s:update.bar .= job.error ? 'x' : '=' - let bullet = job.error ? 'x' : '-' + let more = len(get(job, 'queue', [])) + let bullet = job.error ? 'x' : more ? (job.new ? '+' : '*') : '-' let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) - call s:log(bullet, a:name, empty(result) ? 'OK' : result) - call s:bar() + if len(result) + call s:log(bullet, a:name, result) + endif - call remove(s:jobs, a:name) + if !job.error && more + let job.spec.queue = job.queue + let s:update.todo[a:name] = job.spec + else + let s:update.bar .= job.error ? 'x' : '=' + call s:bar() + endif endfunction function! s:bar() @@ -1538,6 +1549,16 @@ function! s:update_vim() call s:tick() endfunction +function! s:checkout_command(spec) + let a:spec.branch = s:git_origin_branch(a:spec) + return ['git', 'checkout', '-q', a:spec.branch, '--'] +endfunction + +function! s:merge_command(spec) + let a:spec.branch = s:git_origin_branch(a:spec) + return ['git', 'merge', '--ff-only', 'origin/'.a:spec.branch] +endfunction + function! s:tick() let pull = s:update.pull let prog = s:progress_opt(s:nvim || s:vim8) @@ -1552,13 +1573,18 @@ while 1 " Without TCO, Vim stack is bound to explode let name = keys(s:update.todo)[0] let spec = remove(s:update.todo, name) - let new = empty(globpath(spec.dir, '.git', 1)) + let queue = get(spec, 'queue', []) + let new = empty(globpath(spec.dir, '.git', 1)) - call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') - redraw + if empty(queue) + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + endif let has_tag = has_key(spec, 'tag') - if !new + if len(queue) + call s:spawn(name, spec, queue, { 'dir': spec.dir }) + elseif !new let [error, _] = s:git_validate(spec, 0) if empty(error) if pull @@ -1569,7 +1595,11 @@ while 1 " Without TCO, Vim stack is bound to explode if !empty(prog) call add(cmd, prog) endif - call s:spawn(name, cmd, { 'dir': spec.dir }) + let queue = [cmd, split('git remote set-head origin -a')] + if !has_tag && !has_key(spec, 'commit') + call extend(queue, [function('s:checkout_command'), function('s:merge_command')]) + endif + call s:spawn(name, spec, queue, { 'dir': spec.dir }) else let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } endif @@ -1584,7 +1614,7 @@ while 1 " Without TCO, Vim stack is bound to explode if !empty(prog) call add(cmd, prog) endif - call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) + call s:spawn(name, spec, [extend(cmd, [spec.uri, s:trim(spec.dir)]), function('s:checkout_command'), function('s:merge_command')], { 'new': 1 }) endif if !s:jobs[name].running diff --git a/test/workflow.vader b/test/workflow.vader index 8f17315..e7ecc7a 100644 --- a/test/workflow.vader +++ b/test/workflow.vader @@ -983,7 +983,8 @@ Execute (PlugInstall!): Assert filereadable(g:plugs['vim-easy-align'].dir.'/installed2'), \ 'vim-easy-align/installed2 should exist' AssertEqual '7f8cd78cb1fe52185b98b16a3749811f0cc508af', GitCommit('vim-pseudocl') - AssertEqual 'no-t_co', GitBranch('seoul256.vim') + " Was updated to the default branch of origin by previous PlugUpdate + AssertEqual 'master', GitBranch('seoul256.vim') AssertEqual '1.5.3', GitTag('goyo.vim') Execute (When submodules are not initialized): From 3049761d47cacd19b37863dc9dc93ce49590c206 Mon Sep 17 00:00:00 2001 From: "R. N. West" <98110034+rnwst@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:14:08 +0000 Subject: [PATCH 11/12] Add dark mode vim-plug logo and use correct logo version in README (#1267) --- README.md | 11 +++++++++-- plug-dark.png | Bin 0 -> 27006 bytes 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 plug-dark.png diff --git a/README.md b/README.md index 602e585..9476fb1 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,15 @@
-vim-plug[![build](https://img.shields.io/github/actions/workflow/status/junegunn/vim-plug/test.yml?branch=master)](https://github.com/junegunn/vim-plug/actions/workflows/test.yml?query=branch%3Amaster) -=== +

+ + + vim-plug + + + + +

A minimalist Vim plugin manager. diff --git a/plug-dark.png b/plug-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..457bcd6f7aa36ffda5356e13cfa11c57e75a3a18 GIT binary patch literal 27006 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 literal 0 HcmV?d00001 From 854b081934dd6114a03df712d9f5c3a5818c7c94 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 7 Mar 2024 01:16:12 +0900 Subject: [PATCH 12/12] Open vim-plug window in a new tab (#1274) * Open vim-plug window in a new tab not to disrupt the current window layout * Open preview window on the right to better show the diff If you prefer the old layout, use the following configuration: let g:plug_window = 'vertical topleft new' let g:plug_pwindow = 'above 12new' --- README.md | 4 ++-- doc/plug.txt | 6 +++--- plug.vim | 6 +++--- test/workflow.vader | 9 +++++++++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 9476fb1..06cb515 100644 --- a/README.md +++ b/README.md @@ -250,8 +250,8 @@ More examples can be found in: | `g:plug_timeout` | 60 | Time limit of each task in seconds (*Ruby & Python*) | | `g:plug_retries` | 2 | Number of retries in case of timeout (*Ruby & Python*) | | `g:plug_shallow` | 1 | Use shallow clone | -| `g:plug_window` | `vertical topleft new` | Command to open plug window | -| `g:plug_pwindow` | `above 12new` | Command to open preview window in `PlugDiff` | +| `g:plug_window` | `-tabnew` | Command to open plug window | +| `g:plug_pwindow` | `vertical rightbelow new` | Command to open preview window in `PlugDiff` | | `g:plug_url_format` | `https://git::@github.com/%s.git` | `printf` format to build repo URL (Only applies to the subsequent `Plug` commands) | diff --git a/doc/plug.txt b/doc/plug.txt index 3cad4f9..18ba7a5 100644 --- a/doc/plug.txt +++ b/doc/plug.txt @@ -1,4 +1,4 @@ -plug.txt plug Last change: February 23 2024 +plug.txt plug Last change: March 7 2024 PLUG - TABLE OF CONTENTS *plug* *plug-toc* ============================================================================== @@ -230,8 +230,8 @@ Reload .vimrc and `:PlugInstall` to install plugins. `g:plug_timeout` | 60 | Time limit of each task in seconds (Ruby & Python) `g:plug_retries` | 2 | Number of retries in case of timeout (Ruby & Python) `g:plug_shallow` | 1 | Use shallow clone - `g:plug_window` | `vertical topleft new` | Command to open plug window - `g:plug_pwindow` | `above 12new` | Command to open preview window in `PlugDiff` + `g:plug_window` | `-tabnew` | Command to open plug window + `g:plug_pwindow` | `vertical rightbelow new` | Command to open preview window in `PlugDiff` `g:plug_url_format` | `https://git::@github.com/%s.git` | `printf` format to build repo URL (Only applies to the subsequent `Plug` commands) --------------------+-----------------------------------+----------------------------------------------------------------------------------- diff --git a/plug.vim b/plug.vim index f9827bc..3badb4d 100644 --- a/plug.vim +++ b/plug.vim @@ -878,7 +878,7 @@ function! s:lastline(msg) endfunction function! s:new_window() - execute get(g:, 'plug_window', 'vertical topleft new') + execute get(g:, 'plug_window', '-tabnew') endfunction function! s:plug_window_exists() @@ -2684,8 +2684,8 @@ function! s:preview_commit() return endif - if exists('g:plug_pwindow') && !s:is_preview_window_open() - execute g:plug_pwindow + if !s:is_preview_window_open() + execute get(g:, 'plug_pwindow', 'vertical rightbelow new') execute 'e' title else execute 'pedit' title diff --git a/test/workflow.vader b/test/workflow.vader index e7ecc7a..83d075e 100644 --- a/test/workflow.vader +++ b/test/workflow.vader @@ -371,6 +371,9 @@ Execute (PlugDiff - 'No updates.'): q Execute (New commits on remote, PlugUpdate, then PlugDiff): + let g:plug_window = 'vertical topleft new' + let g:plug_pwindow = 'above 12new' + for repo in ['seoul256.vim', 'vim-emoji'] for _ in range(2) call system(printf('cd /tmp/vim-plug-test/junegunn/%s && git commit --allow-empty -m "update"', repo)) @@ -458,6 +461,8 @@ Execute (New commits on remote, PlugUpdate, then PlugDiff): AssertEqual 1, &previewwindow pclose + unlet g:plug_window g:plug_pwindow + Execute (Test g:plug_pwindow): let g:plug_pwindow = 'below 5new' PlugDiff @@ -1709,6 +1714,8 @@ Execute (#530 - Comparison of incompatible git URIs): Assert !CompareURI('https://github.com/junegunn/vim-plug.git', 'https://github.com:12345/junegunn/vim-plug.git') Execute (#532 - Reuse plug window): + let g:plug_window = 'vertical topleft new' + let g:plug_pwindow = 'above 12new' call plug#begin() Plug 'junegunn/goyo.vim' call plug#end() @@ -1735,6 +1742,8 @@ Execute (#532 - Reuse plug window): AssertEqual 2, winnr('$'), 'Three windows after PlugStatus (but got '.winnr('$').')' q + unlet g:plug_window g:plug_pwindow + Execute (#766 - Allow cloning into an empty directory): let d = '/tmp/vim-plug-test/goyo-already' call system('rm -rf ' . d)