From 2601cdd5e4a0dacf0c3d3d099a64eb2d581cdf24 Mon Sep 17 00:00:00 2001 From: Vivian De Smedt Date: Wed, 25 Sep 2024 20:46:52 +0200 Subject: [PATCH 1/3] 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 2/3] 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 3/3] 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)