Blame SOURCES/0001-patch-8.2.4327-may-end-up-with-no-current-buffer.patch

af580a
From e3537aec2f8d6470010547af28dcbd83d41461b8 Mon Sep 17 00:00:00 2001
af580a
From: Bram Moolenaar <Bram@vim.org>
af580a
Date: Tue, 8 Feb 2022 15:05:20 +0000
af580a
Subject: [PATCH] patch 8.2.4327: may end up with no current buffer
af580a
af580a
Problem:    May end up with no current buffer.
af580a
Solution:   When deleting the current buffer to not pick a quickfix buffer as
af580a
            the new current buffer.
af580a
---
af580a
 src/buffer.c                  | 26 ++++++++++++++++++++++----
af580a
 src/testdir/test_quickfix.vim | 25 +++++++++++++++++++++++++
af580a
 src/version.c                 |  2 ++
af580a
 3 files changed, 49 insertions(+), 4 deletions(-)
af580a
af580a
diff --git a/src/buffer.c b/src/buffer.c
af580a
index 81bdb31ca..b3e2bc3f9 100644
af580a
--- a/src/buffer.c
af580a
+++ b/src/buffer.c
af580a
@@ -1430,8 +1430,14 @@ do_buffer_ext(
af580a
 		buf = buflist_findnr(curwin->w_jumplist[jumpidx].fmark.fnum);
af580a
 		if (buf != NULL)
af580a
 		{
af580a
-		    if (buf == curbuf || !buf->b_p_bl)
af580a
-			buf = NULL;	// skip current and unlisted bufs
af580a
+		    // Skip current and unlisted bufs.  Also skip a quickfix
af580a
+		    // buffer, it might be deleted soon.
af580a
+		    if (buf == curbuf || !buf->b_p_bl
af580a
+#if defined(FEAT_QUICKFIX)
af580a
+			    || bt_quickfix(buf)
af580a
+#endif
af580a
+			    )
af580a
+			buf = NULL;
af580a
 		    else if (buf->b_ml.ml_mfp == NULL)
af580a
 		    {
af580a
 			// skip unloaded buf, but may keep it for later
af580a
@@ -1467,7 +1473,11 @@ do_buffer_ext(
af580a
 		    continue;
af580a
 		}
af580a
 		// in non-help buffer, try to skip help buffers, and vv
af580a
-		if (buf->b_help == curbuf->b_help && buf->b_p_bl)
af580a
+		if (buf->b_help == curbuf->b_help && buf->b_p_bl
af580a
+#if defined(FEAT_QUICKFIX)
af580a
+			    && !bt_quickfix(buf)
af580a
+#endif
af580a
+			   )
af580a
 		{
af580a
 		    if (buf->b_ml.ml_mfp != NULL)   // found loaded buffer
af580a
 			break;
af580a
@@ -1485,7 +1495,11 @@ do_buffer_ext(
af580a
 	if (buf == NULL)	// No loaded buffer, find listed one
af580a
 	{
af580a
 	    FOR_ALL_BUFFERS(buf)
af580a
-		if (buf->b_p_bl && buf != curbuf)
af580a
+		if (buf->b_p_bl && buf != curbuf
af580a
+#if defined(FEAT_QUICKFIX)
af580a
+			    && !bt_quickfix(buf)
af580a
+#endif
af580a
+		       )
af580a
 		    break;
af580a
 	}
af580a
 	if (buf == NULL)	// Still no buffer, just take one
af580a
@@ -1494,6 +1508,10 @@ do_buffer_ext(
af580a
 		buf = curbuf->b_next;
af580a
 	    else
af580a
 		buf = curbuf->b_prev;
af580a
+#if defined(FEAT_QUICKFIX)
af580a
+	    if (bt_quickfix(buf))
af580a
+		buf = NULL;
af580a
+#endif
af580a
 	}
af580a
     }
af580a
 
af580a
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
af580a
index 07fdb9644..adb0ea4fd 100644
af580a
--- a/src/testdir/test_quickfix.vim
af580a
+++ b/src/testdir/test_quickfix.vim
af580a
@@ -5851,5 +5851,30 @@ func Test_lopen_bwipe()
af580a
   delfunc R
af580a
 endfunc
af580a
 
af580a
+" Another sequence of commands that caused all buffers to be wiped out
af580a
+func Test_lopen_bwipe_all()
af580a
+  let lines =<< trim END
af580a
+    func R()
af580a
+      silent! tab lopen
af580a
+      e foo
af580a
+      silent! lfile
af580a
+    endfunc
af580a
+    cal R()
af580a
+    exe "norm \<C-W>\<C-V>0"
af580a
+    cal R()
af580a
+    bwipe
af580a
+
af580a
+    call writefile(['done'], 'Xresult')
af580a
+    qall!
af580a
+  END
af580a
+  call writefile(lines, 'Xscript')
af580a
+  if RunVim([], [], '-u NONE -n -X -Z -e -m -s -S Xscript')
af580a
+    call assert_equal(['done'], readfile('Xresult'))
af580a
+  endif
af580a
+
af580a
+  call delete('Xscript')
af580a
+  call delete('Xresult')
af580a
+endfunc
af580a
+
af580a
 
af580a
 " vim: shiftwidth=2 sts=2 expandtab
af580a
-- 
af580a
2.35.1
af580a