From 6e509db6ff0a73f0495d0ff7210fdc63b82d2528 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 15 Sep 2014 19:12:52 +0900 Subject: [PATCH 1/3] Add `U` keybinding for updating plugins --- README.md | 1 + plug.vim | 37 +++++++++++++++++++++---------- test/workflow.vader | 53 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 79 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a9f7e84..ac0e1ea 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ Reload .vimrc and `:PlugInstall` to install plugins. - `D` - `PlugDiff` - `S` - `PlugStatus` - `R` - Retry failed update or installation tasks +- `U` - Update plugins in the selected range - `q` - Close the window - `:PlugStatus` - `L` - Load plugin diff --git a/plug.vim b/plug.vim index 9221800..59f2d22 100644 --- a/plug.vim +++ b/plug.vim @@ -107,8 +107,8 @@ function! s:define_commands() if !executable('git') return s:err('`git` executable not found. vim-plug requires git.') endif - command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install('' == '!', ) - command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update('' == '!', ) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install('' == '!', []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update('' == '!', []) command! -nargs=0 -bar -bang PlugClean call s:clean('' == '!') command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:me | endif command! -nargs=0 -bar PlugStatus call s:status() @@ -387,12 +387,12 @@ function! s:infer_properties(name, repo) endif endfunction -function! s:install(force, ...) - call s:update_impl(0, a:force, a:000) +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) endfunction -function! s:update(force, ...) - call s:update_impl(1, a:force, a:000) +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) endfunction function! plug#helptags() @@ -476,10 +476,12 @@ function! s:prepare() silent %d _ else call s:new_window() - nnoremap q :if b:plug_preview==1pcendifq + nnoremap q :if b:plug_preview==1pcendifechoq nnoremap R :silent! call retry() nnoremap D :PlugDiff nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() nnoremap ]] :silent! call section('') nnoremap [[ :silent! call section('b') let b:plug_preview = -1 @@ -1120,17 +1122,21 @@ function! s:status() normal! gg setlocal nomodifiable if unloaded - echo "Press 'L' on each line to load plugin" + echo "Press 'L' on each line to load plugin, or 'U' to update" nnoremap L :call status_load(line('.')) xnoremap L :call status_load(line('.')) end endfunction +function! s:extract_name(str, prefix, suffix) + let matches = matchlist(a:str, '^' .a:prefix. ' \([^:]\+\):.*'.a:suffix. '$') + return get(matches, 1, '') +endfunction + function! s:status_load(lnum) let line = getline(a:lnum) - let matches = matchlist(line, '^- \([^:]*\):.*(not loaded)$') - if !empty(matches) - let name = matches[1] + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) call plug#load(name) setlocal modifiable call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) @@ -1138,6 +1144,15 @@ function! s:status_load(lnum) endif endfunction +function! s:status_update() range + let line = getline(a:firstline, a:lastline) + let names = filter(map(line, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + function! s:is_preview_window_open() silent! wincmd P if &previewwindow diff --git a/test/workflow.vader b/test/workflow.vader index e9cc3a1..bb48d84 100644 --- a/test/workflow.vader +++ b/test/workflow.vader @@ -27,7 +27,7 @@ Execute (Initialize test environment): endfunction function! AssertExpect(bang, pat, cnt) - let op = a:bang ? '==' : '=~' + let op = a:bang ? '==#' : '=~#' AssertEqual a:cnt, len(filter(getline(1, '$'), "v:val ".op." '".a:pat."'")) endfunction command! -nargs=+ -bang AssertExpect call AssertExpect('' == '!', ) @@ -873,6 +873,7 @@ Execute (Open plug window in a new tab): normal S AssertEqual tabnr, tabpagenr() q + unlet g:plug_window ********************************************************************** ~ g:plug_url_format @@ -885,6 +886,56 @@ Execute (Using g:plug_url_format): Plug 'beauty256' AssertEqual 'git@bitbucket.org:junegunn/seoul256.vim.git', g:plugs['seoul256.vim'].uri AssertEqual 'git@bitsocket.org:vim-scripts/beauty256.git', g:plugs['beauty256'].uri + unlet g:plug_url_format + +********************************************************************** +~ U +********************************************************************** +Execute (Plug block): + call plug#begin() + Plug 'junegunn/vim-easy-align' + Plug 'junegunn/vim-emoji' + call plug#end() + +Execute (Update plugin with U key in normal mode): + PlugStatus + /emoji + normal U + Log getline(1, '$') + AssertExpect 'Updated', 1 + AssertExpect 'vim-emoji', 1 + AssertExpect 'vim-easy-align', 0 + AssertExpect! '[=]', 1 + + " From PlugInstall screen + PlugInstall + /easy-align + normal U + AssertExpect 'Updated', 1 + AssertExpect 'vim-emoji', 0 + AssertExpect 'vim-easy-align', 1 + AssertExpect! '[=]', 1 + q + +Execute (Update plugins with U key in visual mode): + silent! call system('rm -rf '.g:plugs['vim-easy-align'].dir) + + PlugStatus + normal VGU + Log getline(1, '$') + AssertExpect 'Updated', 1 + AssertExpect 'vim-emoji', 1 + AssertExpect 'vim-easy-align', 1 + AssertExpect! '[==]', 1 + + " From PlugUpdate screen + normal VGU + Log getline(1, '$') + AssertExpect 'Updated', 1 + AssertExpect 'vim-emoji', 1 + AssertExpect 'vim-easy-align', 1 + AssertExpect! '[==]', 1 + q Execute (Cleanup): silent! call system('rm -rf '.temp_plugged) From cabaf7b4312b4afbade0eb6bd10c09ae0133fd9d Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 15 Sep 2014 21:02:08 +0900 Subject: [PATCH 2/3] Use blackhole register when deleting lines --- plug.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plug.vim b/plug.vim index 59f2d22..6bf82aa 100644 --- a/plug.vim +++ b/plug.vim @@ -626,7 +626,7 @@ function! s:update_impl(pull, force, args) abort catch let lines = getline(4, '$') let printed = {} - silent 4,$d + silent 4,$d _ for line in lines let name = get(matchlist(line, '^. \([^:]\+\):'), 1, '') if empty(name) || !has_key(printed, name) From d6590fa88379484cd097fc151ddf1caeb7243510 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 15 Sep 2014 21:03:37 +0900 Subject: [PATCH 3/3] Code cleanup --- plug.vim | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plug.vim b/plug.vim index 6bf82aa..b377963 100644 --- a/plug.vim +++ b/plug.vim @@ -628,7 +628,7 @@ function! s:update_impl(pull, force, args) abort let printed = {} silent 4,$d _ for line in lines - let name = get(matchlist(line, '^. \([^:]\+\):'), 1, '') + let name = matchstr(line, '^. \zs[^:]\+\ze:') if empty(name) || !has_key(printed, name) call append('$', line) if !empty(name) @@ -1129,8 +1129,7 @@ function! s:status() endfunction function! s:extract_name(str, prefix, suffix) - let matches = matchlist(a:str, '^' .a:prefix. ' \([^:]\+\):.*'.a:suffix. '$') - return get(matches, 1, '') + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') endfunction function! s:status_load(lnum) @@ -1145,8 +1144,8 @@ function! s:status_load(lnum) endfunction function! s:status_update() range - let line = getline(a:firstline, a:lastline) - let names = filter(map(line, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') if !empty(names) echo execute 'PlugUpdate' join(names)