[vim] Fix issue with multiple popups (#1927)

Invoking fzf from an existing Vim popup terminal is a special case.
It requires some new code to avoid E994 from being raised and the user
being stuck in a non-closable popup window.

Fix #1916
This commit is contained in:
lacygoill 2020-03-29 19:06:06 +02:00 committed by GitHub
parent b1b916ce15
commit 0f5c6e8f04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -651,7 +651,7 @@ function! s:calc_size(max, val, dict)
endfunction endfunction
function! s:getpos() function! s:getpos()
return {'tab': tabpagenr(), 'win': winnr(), 'cnt': winnr('$'), 'tcnt': tabpagenr('$')} return {'tab': tabpagenr(), 'win': winnr(), 'winid': win_getid(), 'cnt': winnr('$'), 'tcnt': tabpagenr('$')}
endfunction endfunction
function! s:split(dict) function! s:split(dict)
@ -727,8 +727,8 @@ function! s:execute_term(dict, command, temps) abort
" there's no other listed buffer (nvim +'set nobuflisted') " there's no other listed buffer (nvim +'set nobuflisted')
close close
endif endif
execute 'tabnext' self.ppos.tab silent! execute 'tabnext' self.ppos.tab
execute self.ppos.win.'wincmd w' silent! execute self.ppos.win.'wincmd w'
endif endif
if bufexists(self.buf) if bufexists(self.buf)
@ -837,7 +837,7 @@ if has('nvim')
else else
function! s:create_popup(hl, opts) abort function! s:create_popup(hl, opts) abort
let is_frame = has_key(a:opts, 'border') let is_frame = has_key(a:opts, 'border')
let buf = is_frame ? '' : term_start(&shell, #{hidden: 1}) let buf = is_frame ? '' : term_start(&shell, #{hidden: 1, term_finish: 'close'})
let id = popup_create(buf, #{ let id = popup_create(buf, #{
\ line: a:opts.row, \ line: a:opts.row,
\ col: a:opts.col, \ col: a:opts.col,
@ -851,7 +851,7 @@ else
call setbufline(winbufnr(id), 1, a:opts.border) call setbufline(winbufnr(id), 1, a:opts.border)
execute 'autocmd BufWipeout * ++once call popup_close('..id..')' execute 'autocmd BufWipeout * ++once call popup_close('..id..')'
else else
execute 'autocmd BufWipeout * ++once bwipeout! '..buf execute 'autocmd BufWipeout * ++once call term_sendkeys('..buf..', "exit\<CR>")'
endif endif
return winbufnr(id) return winbufnr(id)
endfunction endfunction