From 7fa22a69270894b2b38af859eb5ee0c4567c9563 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 14 Apr 2014 21:20:21 +0900 Subject: [PATCH] PlugDiff: Display commit info in preview window --- plug.vim | 75 ++++++++++++++++++++++++++++++++++++------ test/workflow.vader | 79 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 143 insertions(+), 11 deletions(-) diff --git a/plug.vim b/plug.vim index 2042f64..40e6218 100644 --- a/plug.vim +++ b/plug.vim @@ -57,7 +57,7 @@ set cpo&vim let s:plug_source = 'https://raw.github.com/junegunn/vim-plug/master/plug.vim' let s:plug_file = 'Plugfile' -let s:plug_win = 0 +let s:plug_buf = -1 let s:is_win = has('win32') || has('win64') let s:me = expand(':p') @@ -262,7 +262,7 @@ function! s:syntax() syn match plugDash /^-/ syn match plugName /\(^- \)\@<=[^:]*/ syn match plugCommit /^ [0-9a-z]\{7} .*/ contains=plugRelDate,plugSha - syn match plugSha /^ [0-9a-z]\{7}/ contained + syn match plugSha /\(^ \)\@<=[0-9a-z]\{7}/ contained syn match plugRelDate /([^)]*)$/ contained syn match plugError /^x.*/ syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean @@ -288,18 +288,27 @@ function! s:lastline(msg) endfunction function! s:prepare() - execute s:plug_win . 'wincmd w' - if exists('b:plug') + if bufexists(s:plug_buf) + let winnr = bufwinnr(s:plug_buf) + if winnr < 0 + vertical topleft new + execute 'buffer ' . s:plug_buf + else + execute winnr . 'wincmd w' + endif %d else vertical topleft new - nnoremap q :q - nnoremap D :PlugDiff - nnoremap S :PlugStatus - let b:plug = 1 - let s:plug_win = winnr() + nnoremap q :if b:plug_preview==1pcendifq + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') + let b:plug_preview = -1 + let s:plug_buf = winbufnr(0) call s:assign_name() endif + silent! unmap setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap cursorline setf vim-plug call s:syntax() @@ -324,6 +333,8 @@ function! s:finish() call s:syntax() call setline(4, getline(4) . 'Done!') normal! gg + redraw + echo "Press 'D' to see the updated changes." endfunction function! s:update_impl(pull, args) @@ -770,9 +781,54 @@ function! s:status() normal! gg endfunction +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif + return 0 +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '\(^ \)\@<=[0-9a-z]\{7}') + if !empty(sha) + let lnum = line('.') + while lnum > 1 + let lnum -= 1 + let line = getline(lnum) + let name = matchstr(line, '\(^- \)\@<=[^:]\+') + if !empty(name) + let dir = g:plugs[name].dir + if isdirectory(dir) + execute 'cd '.s:esc(dir) + execute 'pedit '.sha + wincmd P + setlocal filetype=git buftype=nofile nobuflisted + execute 'silent read !git show '.sha + normal! ggdd + wincmd p + cd - + endif + break + endif + endwhile + endif +endfunction + +function! s:section(flags) + call search('\(^- \)\@<=.', a:flags) +endfunction + function! s:diff() call s:prepare() call append(0, 'Collecting updated changes ...') + normal! gg + redraw let cnt = 0 for [k, v] in items(g:plugs) @@ -794,6 +850,7 @@ function! s:diff() endfor call setline(1, cnt == 0 ? 'No updates.' : 'Last update:') + nnoremap :silent! call preview_commit() normal! gg endfunction diff --git a/test/workflow.vader b/test/workflow.vader index 8664d3b..809ace3 100644 --- a/test/workflow.vader +++ b/test/workflow.vader @@ -13,6 +13,7 @@ Execute (Initialize test environment): set t_Co=256 colo default + pclose let g:vimrc_reloaded = 0 let vimrc = tempname() @@ -215,10 +216,84 @@ Execute (PlugUpdate to install both again): Assert !empty(globpath(&rtp, 'autoload/emoji.vim')), 'vim-emoji should be found' q -Execute (PlugUpdate only to find out plugins are up-to-date): +Execute (PlugUpdate only to find out plugins are up-to-date, D key to check): PlugUpdate AssertEqual 2, len(filter(getline(1, line('$')), 'v:val =~ "Already up-to-date"')) AssertEqual 3, g:vimrc_reloaded + normal D + AssertEqual 'No updates.', getline(1) + q + +Execute (PlugDiff - 'No updates.'): + PlugDiff + AssertEqual 'No updates.', getline(1) + q + +Execute (Rollback recent updates, PlugUpdate, then PlugDiff): + for repo in ['seoul256.vim', 'vim-emoji'] + call system(printf('cd %s/%s && git reset HEAD^^ --hard', g:plug_home, repo)) + endfor + PlugUpdate + + " Now we have updates + normal D + AssertEqual 'Last update:', getline(1) + + " Preview commit + silent! wincmd P + AssertEqual 0, &previewwindow + + " ]] motion + execute 'normal ]]' + let lnum = line('.') + AssertEqual 3, col('.') + + " Open commit preview + execute "normal j\" + wincmd P + AssertEqual 1, &previewwindow + AssertEqual 'git', &filetype + + " Back to plug window + wincmd p + + " ]] motion + execute 'normal $]]' + AssertEqual lnum + 4, line('.') + AssertEqual 3, col('.') + + " [[ motion + execute 'normal 0[[' + AssertEqual lnum, line('.') + AssertEqual 3, col('.') + + " q will close preview window as well + normal q + + " We no longer have preview window + silent! wincmd P + AssertEqual 0, &previewwindow + + " q should not close preview window if it's already open + pedit + PlugDiff + execute "normal ]]j\" + normal q + + silent! wincmd P + AssertEqual 1, &previewwindow + pclose + +Execute (Plug window in a new tab): + PlugDiff + tab new new-tab + set buftype=nofile + PlugUpdate + normal D + AssertEqual 'No updates.', getline(1) + q + AssertEqual 'new-tab', expand('%') + q q Execute (Cleanup): @@ -227,7 +302,7 @@ Execute (Cleanup): unlet g:plugs unlet g:plug_home unlet g:vimrc_reloaded - unlet temp_plugged vader plug basertp save_rtp + unlet temp_plugged vader plug basertp save_rtp repo lnum Restore source $MYVIMRC