From 469ae5c9f7cfd7047dd2dbf58a199966ba6bf28b Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Tue, 13 Aug 2019 21:16:13 +0200 Subject: [PATCH] Vim: make :SignifyPreviewHunk use popup window References https://github.com/mhinz/vim-signify/pull/302 --- autoload/sy/repo.vim | 26 +++++++++--------- autoload/sy/util.vim | 65 ++++++++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/autoload/sy/repo.vim b/autoload/sy/repo.vim index 1f60269..26a1a89 100644 --- a/autoload/sy/repo.vim +++ b/autoload/sy/repo.vim @@ -306,20 +306,20 @@ function! s:preview_hunk(_sy, vcs, diff) abort return endif - if exists('*nvim_open_win') - call sy#util#renderPopup(hunk) - else - silent! wincmd P - if !&previewwindow - noautocmd botright new - endif - call setline(1, hunk) - silent! %foldopen! - setlocal previewwindow filetype=diff buftype=nofile bufhidden=delete - " With :noautocmd wincmd p, the first line of the preview window would show - " the 'cursorline', although it's not focused. Use feedkeys() instead. - noautocmd call feedkeys("\p", 'nt') + if sy#util#popup_create(hunk) + return endif + + silent! wincmd P + if !&previewwindow + noautocmd botright new + endif + call setline(1, hunk) + silent! %foldopen! + setlocal previewwindow filetype=diff buftype=nofile bufhidden=delete + " With :noautocmd wincmd p, the first line of the preview window would show + " the 'cursorline', although it's not focused. Use feedkeys() instead. + noautocmd call feedkeys("\p", 'nt') endfunction function! s:is_cur_line_in_hunk(hunkline) abort diff --git a/autoload/sy/util.vim b/autoload/sy/util.vim index fc5688a..09d3137 100644 --- a/autoload/sy/util.vim +++ b/autoload/sy/util.vim @@ -108,41 +108,54 @@ function! sy#util#execute(cmd) abort return output endfunction -let s:window = 0 +let s:popup_window = 0 -function! sy#util#closePopup() - if s:window - let id = win_id2win(s:window) - if id > 0 - execute id . 'close!' - endif - let s:window = 0 +function! sy#util#popup_close() abort + if s:popup_window + call nvim_win_close(s:popup_window, 1) + let s:popup_window = 0 endif endfunction -function! sy#util#renderPopup(input, ...) - call sy#util#closePopup() - let s:buf = nvim_create_buf(0, 1) - call nvim_buf_set_option(s:buf, 'syntax', 'diff') +function! sy#util#popup_create(hunkdiff, ...) abort let max_width = 100 let max_height = 16 - let width = max(map(copy(a:input), {_, v -> len(v)})) + 1 + let width = max(map(copy(a:hunkdiff), {_, v -> len(v)})) + 1 let width = (width > max_width) ? max_width : width - let height = len(a:input) + let height = len(a:hunkdiff) let height = (height > max_height) ? max_height : height - call nvim_buf_set_lines(s:buf, 0, -1, 0, a:input) - let s:window = call('nvim_open_win', [s:buf, v:false, { + + if exists('*nvim_open_win') + call sy#util#popup_close() + let buf = nvim_create_buf(0, 1) + call nvim_buf_set_option(buf, 'syntax', 'diff') + call nvim_buf_set_lines(buf, 0, -1, 0, a:hunkdiff) + let s:popup_window = call('nvim_open_win', [buf, v:false, { \ 'relative': 'cursor', \ 'row': 0, \ 'col': 0, - \ 'width': width, - \ 'height': height, + \ 'width': width, + \ 'height': height, \ }]) - call nvim_win_set_option(s:window, 'cursorline', v:false) - call nvim_win_set_option(s:window, 'foldenable', v:false) - call nvim_win_set_option(s:window, 'number', v:false) - call nvim_win_set_option(s:window, 'relativenumber', v:false) - call nvim_win_set_option(s:window, 'statusline', '') - call nvim_win_set_option(s:window, 'wrap', v:true) - autocmd CursorMoved * call sy#util#closePopup() -endfunction \ No newline at end of file + call nvim_win_set_option(s:popup_window, 'cursorline', v:false) + call nvim_win_set_option(s:popup_window, 'foldenable', v:false) + call nvim_win_set_option(s:popup_window, 'number', v:false) + call nvim_win_set_option(s:popup_window, 'relativenumber', v:false) + call nvim_win_set_option(s:popup_window, 'wrap', v:true) + autocmd CursorMoved * ++once call sy#util#popup_close() + elseif exists('*popup_create') + let s:popup_window = popup_create(a:hunkdiff, { + \ 'line': 'cursor', + \ 'col': 'cursor', + \ 'maxwidth': width, + \ 'maxheight': height, + \ 'moved': 'any', + \ 'zindex': 1000, + \ }) + call setbufvar(winbufnr(s:popup_window), '&filetype', 'diff') + else + return 0 + endif + + return 1 +endfunction