70 lines
1.8 KiB
VimL
70 lines
1.8 KiB
VimL
if exists("loaded_bclosePlugin")
|
|
finish
|
|
endif
|
|
if (v:progname == "ex")
|
|
finish
|
|
endif
|
|
let loaded_bclosePlugin = 1
|
|
|
|
|
|
"here is a more exotic version of my original Kwbd script
|
|
"delete the buffer; keep windows; create a scratch buffer if no buffers left
|
|
function s:Kwbd(kwbdStage)
|
|
if(a:kwbdStage == 1)
|
|
if(!buflisted(winbufnr(0)))
|
|
bd!
|
|
return
|
|
endif
|
|
let s:kwbdBufNum = bufnr("%")
|
|
let s:kwbdWinNum = winnr()
|
|
windo call s:Kwbd(2)
|
|
execute s:kwbdWinNum . 'wincmd w'
|
|
let s:buflistedLeft = 0
|
|
let s:bufFinalJump = 0
|
|
let l:nBufs = bufnr("$")
|
|
let l:i = 1
|
|
while(l:i <= l:nBufs)
|
|
if(l:i != s:kwbdBufNum)
|
|
if(buflisted(l:i))
|
|
let s:buflistedLeft = s:buflistedLeft + 1
|
|
else
|
|
if(bufexists(l:i) && !strlen(bufname(l:i)) && !s:bufFinalJump)
|
|
let s:bufFinalJump = l:i
|
|
endif
|
|
endif
|
|
endif
|
|
let l:i = l:i + 1
|
|
endwhile
|
|
if(!s:buflistedLeft)
|
|
if(s:bufFinalJump)
|
|
windo if(buflisted(winbufnr(0))) | execute "b! " . s:bufFinalJump | endif
|
|
else
|
|
enew
|
|
let l:newBuf = bufnr("%")
|
|
windo if(buflisted(winbufnr(0))) | execute "b! " . l:newBuf | endif
|
|
endif
|
|
execute s:kwbdWinNum . 'wincmd w'
|
|
endif
|
|
if(buflisted(s:kwbdBufNum) || s:kwbdBufNum == bufnr("%"))
|
|
execute "bd! " . s:kwbdBufNum
|
|
endif
|
|
if(!s:buflistedLeft)
|
|
set buflisted
|
|
set bufhidden=delete
|
|
set buftype=nofile
|
|
setlocal noswapfile
|
|
endif
|
|
else
|
|
if(bufnr("%") == s:kwbdBufNum)
|
|
let prevbufvar = bufnr("#")
|
|
if(prevbufvar > 0 && buflisted(prevbufvar) && prevbufvar != s:kwbdBufNum)
|
|
b #
|
|
else
|
|
bn
|
|
endif
|
|
endif
|
|
endif
|
|
endfunction
|
|
|
|
command! Kwbd call <SID>Kwbd(1)
|
|
nnoremap <silent> <Plug>Kwbd :<C-u>Kwbd<CR>
|