diff --git a/plugin/bbye.vim b/plugin/bbye.vim index 82d482a..b2efe9f 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -28,13 +28,40 @@ function! s:bdelete(action, bang, buffer_name) execute window . "wincmd w" " Bprevious also wraps around the buffer list, if necessary: - try | exe bufnr("#") > 0 && buflisted(bufnr("#")) ? "buffer #" : "bprevious" + " try | exe bufnr("#") > 0 && buflisted(bufnr("#")) ? "buffer #" : "bprevious" + " catch /^Vim([^)]*):E85:/ " E85: There is no listed buffer + " endtry + try + if bufnr("#") > 0 && bufnr("#") != buffer && buflisted(bufnr("#")) && getbufvar(bufnr("#"), '&ft') != 'qf' + " If # buffer is listed and not quickfix switch to it + buffer # + " echom 'swith to alt' + continue + endif + " Emulate bprevious but excluding quickfix buffers + " listed buffer that are not quickfix buffers: + let buffers = map(filter(getbufinfo({'buflisted':1}), "getbufvar(v:val.bufnr, '&ft') != 'qf'"), "v:val.bufnr") + let buffers = filter(buffers, "v:val < buffer") + if len(buffers) + execute "buffer " . buffers[-1] + " echom 'swith to previous' + continue + endif + let buffers = map(filter(getbufinfo({'buflisted':1}), "getbufvar(v:val.bufnr, '&ft') != 'qf'"), "v:val.bufnr") + let buffers = filter(buffers, "v:val > buffer") + " Emulate bprevious but excluding quickfix buffers + if len(buffers) + execute "buffer " . buffers[-1] + " echom 'swith to last' + continue + endif catch /^Vim([^)]*):E85:/ " E85: There is no listed buffer endtry " If found a new buffer for this window, mission accomplished: if bufnr("%") != buffer | continue | endif + " Otherwise create an empty buffer call s:new(a:bang) endfor @@ -84,8 +111,39 @@ function! s:error(msg) let v:errmsg = a:msg endfunction -command! -bang -complete=buffer -nargs=? Bdelete - \ :call s:bdelete("bdelete", , ) +function! s:bdeletes(action, bang, range, arg1, arg2, ...) + let buffer_list = [] + if a:range == 1 + let buffer_list = add(buffer_list, arg1) + elseif a:range == 2 + let buffer_index = a:arg1 + while buffer_index <= a:arg2 + let buffer = s:str2bufnr(buffer_index) + if buffer >= 0 + let buffer_list = add(buffer_list, buffer_index) + endif + let buffer_index = buffer_index + 1 + endwhile + endif + + let i = 1 + for buffer_name in a:000 + let buffer_list = add(buffer_list, buffer_name) + let i = i + 1 + endfor + + if len(buffer_list) == 0 + call s:bdelete(a:action, a:bang, "") + endif + + for buffer_name in buffer_list + call s:bdelete(a:action, a:bang, buffer_name) + endfor +endfunction + +command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bdelete + \ :call s:bdeletes("bdelete", , , , , ) + +command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bwipeout +\ :call s:bdeletes("bwipeout", , , , , ) -command! -bang -complete=buffer -nargs=? Bwipeout - \ :call s:bdelete("bwipeout", , )