]> granicus.if.org Git - vim/commitdiff
patch 8.2.3759: quickfix buffer becomes hidden while still in a window v8.2.3759
authorYegappan Lakshmanan <yegappan@yahoo.com>
Wed, 8 Dec 2021 20:03:31 +0000 (20:03 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 8 Dec 2021 20:03:31 +0000 (20:03 +0000)
Problem:    Quickfix buffer becomes hidden while still in a window.
Solution:   Check if the closed window is the last window showing the quickfix
            buffer. (Yegappan Lakshmanan, closes #9303, closes #9300)

src/quickfix.c
src/testdir/test_quickfix.vim
src/version.c
src/window.c

index d7c0a88a62b15b6b2cc3a6a1c8c01566725b1699..1e25edb7e55a31cfd6c741b1fc3a27d6017a3c28 100644 (file)
@@ -2818,7 +2818,7 @@ qf_get_entry(
 }
 
 /*
- * Find a window displaying a Vim help file.
+ * Find a window displaying a Vim help file in the current tab page.
  */
     static win_T *
 qf_find_help_win(void)
@@ -2893,8 +2893,8 @@ jump_to_help_window(qf_info_T *qi, int newwin, int *opened_window)
 }
 
 /*
- * Find a non-quickfix window in the current tabpage using the given location
- * list stack.
+ * Find a non-quickfix window using the given location list stack in the
+ * current tabpage.
  * Returns NULL if a matching window is not found.
  */
     static win_T *
@@ -2910,7 +2910,7 @@ qf_find_win_with_loclist(qf_info_T *ll)
 }
 
 /*
- * Find a window containing a normal buffer
+ * Find a window containing a normal buffer in the current tab page.
  */
     static win_T *
 qf_find_win_with_normal_buf(void)
@@ -2981,7 +2981,7 @@ qf_goto_win_with_ll_file(win_T *use_win, int qf_fnum, qf_info_T *ll_ref)
 
     if (win == NULL)
     {
-       // Find the window showing the selected file
+       // Find the window showing the selected file in the current tab page.
        FOR_ALL_WINDOWS(win)
            if (win->w_buffer->b_fnum == qf_fnum)
                break;
@@ -4394,8 +4394,8 @@ is_qf_win(win_T *win, qf_info_T *qi)
 }
 
 /*
- * Find a window displaying the quickfix/location stack 'qi'
- * Only searches in the current tabpage.
+ * Find a window displaying the quickfix/location stack 'qi' in the current tab
+ * page.
  */
     static win_T *
 qf_find_win(qf_info_T *qi)
@@ -4410,7 +4410,7 @@ qf_find_win(qf_info_T *qi)
 
 /*
  * Find a quickfix buffer.
- * Searches in windows opened in all the tabs.
+ * Searches in windows opened in all the tab pages.
  */
     static buf_T *
 qf_find_buf(qf_info_T *qi)
index 24526bd77ac3bf6539a44b5f93e1a8e3f22dd607..b242ac5fa2da9cf29ba80c718535f6875436442c 100644 (file)
@@ -5636,4 +5636,40 @@ fun Test_vimgrep_nomatch()
   cclose
 endfunc
 
+" Test for opening the quickfix window in two tab pages and then closing one
+" of the quickfix windows. This should not make the quickfix buffer unlisted.
+" (github issue #9300).
+func Test_two_qf_windows()
+  cexpr "F1:1:line1"
+  copen
+  tabnew
+  copen
+  call assert_true(&buflisted)
+  cclose
+  tabfirst
+  call assert_true(&buflisted)
+  let bnum = bufnr()
+  cclose
+  " if all the quickfix windows are closed, then buffer should be unlisted.
+  call assert_false(buflisted(bnum))
+  %bw!
+
+  " Repeat the test for a location list
+  lexpr "F2:2:line2"
+  lopen
+  let bnum = bufnr()
+  tabnew
+  exe "buffer" bnum
+  tabfirst
+  lclose
+  tablast
+  call assert_true(buflisted(bnum))
+  tabclose
+  lopen
+  call assert_true(buflisted(bnum))
+  lclose
+  call assert_false(buflisted(bnum))
+  %bw!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 6d581753819dd0bc2ce96bccceb9e7d5dbd2e592..13b6a0cf60cddaee2cc9f7e16bba92f9b2ae2594 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3759,
 /**/
     3758,
 /**/
index 4050ed04dda2b0c61147867b5d3a15b888ac99dc..47fb815972b9c744d2078c3f395407a15614c84c 100644 (file)
@@ -2433,8 +2433,10 @@ win_close_buffer(win_T *win, int action, int abort_if_last)
 #endif
 
 #ifdef FEAT_QUICKFIX
-    // When the quickfix/location list window is closed, unlist the buffer.
-    if (win->w_buffer != NULL && bt_quickfix(win->w_buffer))
+    // When a quickfix/location list window is closed and the buffer is
+    // displayed in only one window, then unlist the buffer.
+    if (win->w_buffer != NULL && bt_quickfix(win->w_buffer)
+                                       && win->w_buffer->b_nwindows == 1)
        win->w_buffer->b_p_bl = FALSE;
 #endif