Sfoglia il codice sorgente

Merge pull request #79 from junegunn/U

Add `U` keybinding for updating plugins
Junegunn Choi 11 anni fa
parent
commit
a9fa8f44e5
3 ha cambiato i file con 80 aggiunte e 14 eliminazioni
  1. 1 0
      README.md
  2. 27 13
      plug.vim
  3. 52 1
      test/workflow.vader

+ 1 - 0
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

+ 27 - 13
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('<bang>' == '!', <f-args>)
-  command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate  call s:update('<bang>' == '!', <f-args>)
+  command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install('<bang>' == '!', [<f-args>])
+  command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate  call s:update('<bang>' == '!', [<f-args>])
   command! -nargs=0 -bar -bang PlugClean call s:clean('<bang>' == '!')
   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 <silent> <buffer> q  :if b:plug_preview==1<bar>pc<bar>endif<bar>q<cr>
+    nnoremap <silent> <buffer> q  :if b:plug_preview==1<bar>pc<bar>endif<bar>echo<bar>q<cr>
     nnoremap <silent> <buffer> R  :silent! call <SID>retry()<cr>
     nnoremap <silent> <buffer> D  :PlugDiff<cr>
     nnoremap <silent> <buffer> S  :PlugStatus<cr>
+    nnoremap <silent> <buffer> U  :call <SID>status_update()<cr>
+    xnoremap <silent> <buffer> U  :call <SID>status_update()<cr>
     nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
     nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
     let b:plug_preview = -1
@@ -624,9 +626,9 @@ 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, '')
+        let name = matchstr(line, '^. \zs[^:]\+\ze:')
         if empty(name) || !has_key(printed, name)
           call append('$', line)
           if !empty(name)
@@ -1120,17 +1122,20 @@ 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 <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
     xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
   end
 endfunction
 
+function! s:extract_name(str, prefix, suffix)
+  return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
+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 +1143,15 @@ function! s:status_load(lnum)
   endif
 endfunction
 
+function! s:status_update() range
+  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)
+  endif
+endfunction
+
 function! s:is_preview_window_open()
   silent! wincmd P
   if &previewwindow

+ 52 - 1
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('<bang>' == '!', <args>)
@@ -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)