From 9d47bda15ff488dc71470620c2088c5567cacd7e Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Mon, 23 Jan 2023 13:04:25 +0100 Subject: [PATCH 1/8] all Bdelete to accept multiple arguments or ranges --- plugin/bbye.vim | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index 82d482a..93efa4d 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -84,8 +84,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! -complete=buffer -nargs=* -range=% -addr=buffers Bdelete + \ :call s:bdeletes("bdelete", , , , , ) + +command! -complete=buffer -nargs=* -range=% -addr=buffers Bdelete +\ :call s:bdeletes("bwipeout", , , , , ) -command! -bang -complete=buffer -nargs=? Bwipeout - \ :call s:bdelete("bwipeout", , ) From 6eb62e7ad242a2b9d97713b377bb395505e567af Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Tue, 24 Jan 2023 13:28:55 +0100 Subject: [PATCH 2/8] restore bang support --- plugin/bbye.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index 93efa4d..7c6eb03 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -114,9 +114,9 @@ function! s:bdeletes(action, bang, range, arg1, arg2, ...) endfor endfunction -command! -complete=buffer -nargs=* -range=% -addr=buffers Bdelete +command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bdelete \ :call s:bdeletes("bdelete", , , , , ) -command! -complete=buffer -nargs=* -range=% -addr=buffers Bdelete +command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bdelete \ :call s:bdeletes("bwipeout", , , , , ) From 2601cdd5e4a0dacf0c3d3d099a64eb2d581cdf24 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Wed, 25 Sep 2024 20:46:52 +0200 Subject: [PATCH 3/8] Skip the quickfix buffer when searching alternative buffers (like the non listed buffers are already skipped). --- plugin/bbye.vim | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index 82d482a..fec52cc 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' + break + 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' + break + 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' + break + 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 + if bufnr("%") != buffer | break | endif + " Otherwise create an empty buffer call s:new(a:bang) endfor From d2a5f70ae0df1666e3aabbbd4ce9aa023430ae72 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Thu, 26 Sep 2024 07:51:46 +0200 Subject: [PATCH 4/8] Support the case where mutiple windows (splits) hold the same buffer. --- plugin/bbye.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index fec52cc..77a4814 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -36,7 +36,7 @@ function! s:bdelete(action, bang, buffer_name) " If # buffer is listed and not quickfix switch to it buffer # " echom 'swith to alt' - break + continue endif " Emulate bprevious but excluding quickfix buffers " listed buffer that are not quickfix buffers: @@ -45,7 +45,7 @@ function! s:bdelete(action, bang, buffer_name) if len(buffers) execute "buffer " . buffers[-1] " echom 'swith to previous' - break + 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") @@ -53,7 +53,7 @@ function! s:bdelete(action, bang, buffer_name) if len(buffers) execute "buffer " . buffers[-1] " echom 'swith to last' - break + continue endif catch /^Vim([^)]*):E85:/ " E85: There is no listed buffer endtry From 6d75b622fcf00ba8f68ed5952cfdd0bf9e900e10 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Thu, 26 Sep 2024 07:51:46 +0200 Subject: [PATCH 5/8] Support the case where mutiple windows (splits) hold the same buffer. --- plugin/bbye.vim | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index fec52cc..05785fc 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -36,7 +36,7 @@ function! s:bdelete(action, bang, buffer_name) " If # buffer is listed and not quickfix switch to it buffer # " echom 'swith to alt' - break + continue endif " Emulate bprevious but excluding quickfix buffers " listed buffer that are not quickfix buffers: @@ -45,7 +45,7 @@ function! s:bdelete(action, bang, buffer_name) if len(buffers) execute "buffer " . buffers[-1] " echom 'swith to previous' - break + 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") @@ -53,13 +53,13 @@ function! s:bdelete(action, bang, buffer_name) if len(buffers) execute "buffer " . buffers[-1] " echom 'swith to last' - break + 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 | break | endif + if bufnr("%") != buffer | continue | endif " Otherwise create an empty buffer call s:new(a:bang) From c89a2237c3c208ff2d797b2cf1d68b635d392320 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Wed, 18 Feb 2026 21:13:56 +0100 Subject: [PATCH 6/8] Fix the name of the wipeout command to be Bwipeout --- plugin/bbye.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index 7c6eb03..36fa35b 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -117,6 +117,6 @@ endfunction command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bdelete \ :call s:bdeletes("bdelete", , , , , ) -command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bdelete +command! -bang -complete=buffer -nargs=* -range=% -addr=buffers Bwipeout \ :call s:bdeletes("bwipeout", , , , , ) From 2cafe94600e77f6b83a1390893905e3893253da1 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Wed, 18 Feb 2026 21:17:16 +0100 Subject: [PATCH 7/8] Fix indentation --- plugin/bbye.vim | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index 05785fc..eec5e64 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -43,17 +43,17 @@ function! s:bdelete(action, bang, buffer_name) 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 + 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 + execute "buffer " . buffers[-1] + " echom 'swith to last' + continue endif catch /^Vim([^)]*):E85:/ " E85: There is no listed buffer endtry From bc398a68583885eca57c4eae9ad68b312b099f04 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Wed, 18 Mar 2026 09:39:47 +0100 Subject: [PATCH 8/8] Allow ranges in bbye --- plugin/bbye.vim | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/plugin/bbye.vim b/plugin/bbye.vim index eec5e64..b2efe9f 100644 --- a/plugin/bbye.vim +++ b/plugin/bbye.vim @@ -111,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", , )