[neovim] Fix issues with enew and tabnew layouts

Related: #559
This commit is contained in:
Junegunn Choi 2016-04-28 01:25:24 +09:00
parent 7f64fba80f
commit 0231617857

View File

@ -298,7 +298,7 @@ function! s:split(dict)
\ 'down': ['botright', 'resize', &lines], \ 'down': ['botright', 'resize', &lines],
\ 'left': ['vertical topleft', 'vertical resize', &columns], \ 'left': ['vertical topleft', 'vertical resize', &columns],
\ 'right': ['vertical botright', 'vertical resize', &columns] } \ 'right': ['vertical botright', 'vertical resize', &columns] }
let s:ppos = s:getpos() let ppos = s:getpos()
try try
for [dir, triple] in items(directions) for [dir, triple] in items(directions)
let val = get(a:dict, dir, '') let val = get(a:dict, dir, '')
@ -311,7 +311,7 @@ function! s:split(dict)
endif endif
execute cmd sz.'new' execute cmd sz.'new'
execute resz sz execute resz sz
return {} return [ppos, {}]
endif endif
endfor endfor
if s:present(a:dict, 'window') if s:present(a:dict, 'window')
@ -319,36 +319,44 @@ function! s:split(dict)
else else
execute (tabpagenr()-1).'tabnew' execute (tabpagenr()-1).'tabnew'
endif endif
return { '&l:wfw': &l:wfw, '&l:wfh': &l:wfh } return [ppos, { '&l:wfw': &l:wfw, '&l:wfh': &l:wfh }]
finally finally
setlocal winfixwidth winfixheight setlocal winfixwidth winfixheight
endtry endtry
endfunction endfunction
function! s:execute_term(dict, command, temps) abort function! s:execute_term(dict, command, temps) abort
let winopts = s:split(a:dict) let [ppos, winopts] = s:split(a:dict)
let fzf = { 'buf': bufnr('%'), 'ppos': ppos, 'dict': a:dict, 'temps': a:temps,
let fzf = { 'buf': bufnr('%'), 'dict': a:dict, 'temps': a:temps, 'name': 'FZF', 'winopts': winopts } \ 'name': 'FZF', 'winopts': winopts, 'command': a:command }
let s:command = a:command function! fzf.switch_back(inplace)
if a:inplace && bufnr('') == self.buf
" FIXME: Can't re-enter normal mode from terminal mode
" execute "normal! \<c-^>"
b #
" No other listed buffer
if bufnr('') == self.buf
enew
endif
endif
endfunction
function! fzf.on_exit(id, code) function! fzf.on_exit(id, code)
let pos = s:getpos() if s:getpos() == self.ppos " {'window': 'enew'}
let inplace = pos == s:ppos " {'window': 'enew'}
if inplace
for [opt, val] in items(self.winopts) for [opt, val] in items(self.winopts)
execute 'let' opt '=' val execute 'let' opt '=' val
endfor endfor
call self.switch_back(1)
else else
if bufnr('') == self.buf if bufnr('') == self.buf
" We use close instead of bd! since Vim does not close the split when " We use close instead of bd! since Vim does not close the split when
" there's no other listed buffer (nvim +'set nobuflisted') " there's no other listed buffer (nvim +'set nobuflisted')
close close
endif endif
if pos.tab == s:ppos.tab execute 'tabnext' self.ppos.tab
wincmd p execute self.ppos.win.'wincmd w'
endif
endif endif
if !s:exit_handler(a:code, s:command, 1) if !s:exit_handler(a:code, self.command, 1)
return return
endif endif
@ -356,14 +364,7 @@ function! s:execute_term(dict, command, temps) abort
let ret = [] let ret = []
try try
let ret = s:callback(self.dict, self.temps) let ret = s:callback(self.dict, self.temps)
call self.switch_back(s:getpos() == self.ppos)
if inplace && bufnr('') == self.buf
execute "normal! \<c-^>"
" No other listed buffer
if bufnr('') == self.buf
bd!
endif
endif
finally finally
call s:popd(self.dict, ret) call s:popd(self.dict, ret)
endtry endtry