vim-patch:8.2.4327: may end up with no current buffer

Problem:    May end up with no current buffer.
Solution:   When deleting the current buffer to not pick a quickfix buffer as
            the new current buffer.
e3537aec2f

The test cannot be ported as-is because Nvim doesn't support "-Z"
command line argument. Just use only "--clean" instead.
This commit is contained in:
zeertzjq 2022-03-24 12:39:31 +08:00
parent 19bbc43947
commit d8b4f3e3b8
2 changed files with 34 additions and 4 deletions

View File

@ -1284,8 +1284,10 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
while (jumpidx != curwin->w_jumplistidx) {
buf = buflist_findnr(curwin->w_jumplist[jumpidx].fmark.fnum);
if (buf != NULL) {
if (buf == curbuf || !buf->b_p_bl) {
buf = NULL; // skip current and unlisted bufs
// Skip current and unlisted bufs. Also skip a quickfix
// buffer, it might be deleted soon.
if (buf == curbuf || !buf->b_p_bl || bt_quickfix(buf)) {
buf = NULL;
} else if (buf->b_ml.ml_mfp == NULL) {
// skip unloaded buf, but may keep it for later
if (bp == NULL) {
@ -1323,7 +1325,7 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
continue;
}
// in non-help buffer, try to skip help buffers, and vv
if (buf->b_help == curbuf->b_help && buf->b_p_bl) {
if (buf->b_help == curbuf->b_help && buf->b_p_bl && !bt_quickfix(buf)) {
if (buf->b_ml.ml_mfp != NULL) { // found loaded buffer
break;
}
@ -1343,7 +1345,7 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
}
if (buf == NULL) { // No loaded buffer, find listed one
FOR_ALL_BUFFERS(buf2) {
if (buf2->b_p_bl && buf2 != curbuf) {
if (buf2->b_p_bl && buf2 != curbuf && !bt_quickfix(buf2)) {
buf = buf2;
break;
}
@ -1355,6 +1357,9 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
} else {
buf = curbuf->b_prev;
}
if (bt_quickfix(buf)) {
buf = NULL;
}
}
}

View File

@ -5505,5 +5505,30 @@ func Test_lopen_bwipe()
delfunc R
endfunc
" Another sequence of commands that caused all buffers to be wiped out
func Test_lopen_bwipe_all()
let lines =<< trim END
func R()
silent! tab lopen
e foo
silent! lfile
endfunc
cal R()
exe "norm \<C-W>\<C-V>0"
cal R()
bwipe
call writefile(['done'], 'Xresult')
qall!
END
call writefile(lines, 'Xscript')
if RunVim([], [], '--clean -n -S Xscript')
call assert_equal(['done'], readfile('Xresult'))
endif
call delete('Xscript')
call delete('Xresult')
endfunc
" vim: shiftwidth=2 sts=2 expandtab