]> granicus.if.org Git - vim/commitdiff
patch 8.2.4327: may end up with no current buffer v8.2.4327
authorBram Moolenaar <Bram@vim.org>
Tue, 8 Feb 2022 15:05:20 +0000 (15:05 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 8 Feb 2022 15:05:20 +0000 (15:05 +0000)
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.

src/buffer.c
src/testdir/test_quickfix.vim
src/version.c

index 81bdb31ca1f05b33f0f38ed3d2abf5c611c28497..b3e2bc3f98a3a6cff8b1fda816111acf0c8630ed 100644 (file)
@@ -1430,8 +1430,14 @@ do_buffer_ext(
                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
+#if defined(FEAT_QUICKFIX)
+                           || bt_quickfix(buf)
+#endif
+                           )
+                       buf = NULL;
                    else if (buf->b_ml.ml_mfp == NULL)
                    {
                        // skip unloaded buf, but may keep it for later
@@ -1467,7 +1473,11 @@ do_buffer_ext(
                    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
+#if defined(FEAT_QUICKFIX)
+                           && !bt_quickfix(buf)
+#endif
+                          )
                {
                    if (buf->b_ml.ml_mfp != NULL)   // found loaded buffer
                        break;
@@ -1485,7 +1495,11 @@ do_buffer_ext(
        if (buf == NULL)        // No loaded buffer, find listed one
        {
            FOR_ALL_BUFFERS(buf)
-               if (buf->b_p_bl && buf != curbuf)
+               if (buf->b_p_bl && buf != curbuf
+#if defined(FEAT_QUICKFIX)
+                           && !bt_quickfix(buf)
+#endif
+                      )
                    break;
        }
        if (buf == NULL)        // Still no buffer, just take one
@@ -1494,6 +1508,10 @@ do_buffer_ext(
                buf = curbuf->b_next;
            else
                buf = curbuf->b_prev;
+#if defined(FEAT_QUICKFIX)
+           if (bt_quickfix(buf))
+               buf = NULL;
+#endif
        }
     }
 
index 07fdb9644b505570193391ccf69e60bef1450bda..adb0ea4fd5ce0801c36a0bd0f587ae6e8ef22d08 100644 (file)
@@ -5851,5 +5851,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([], [], '-u NONE -n -X -Z -e -m -s -S Xscript')
+    call assert_equal(['done'], readfile('Xresult'))
+  endif
+
+  call delete('Xscript')
+  call delete('Xresult')
+endfunc
+
 
 " vim: shiftwidth=2 sts=2 expandtab
index 82d12a04b40bc7fae065ccc8473ec97401892780..9d5fbc2e3976c7f9ed6c5640da87655948fd4665 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4327,
 /**/
     4326,
 /**/