Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 63 additions & 5 deletions plugin/bbye.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -84,8 +111,39 @@ function! s:error(msg)
let v:errmsg = a:msg
endfunction

command! -bang -complete=buffer -nargs=? Bdelete
\ :call s:bdelete("bdelete", <q-bang>, <q-args>)
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", <q-bang>, <range>, <line1>, <line2>, <f-args>)

command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bwipeout
\ :call s:bdeletes("bwipeout", <q-bang>, <range>, <line1>, <line2>, <f-args>)

command! -bang -complete=buffer -nargs=? Bwipeout
\ :call s:bdelete("bwipeout", <q-bang>, <q-args>)