Patch 8.1.1015
Problem:    Quickfix buffer shows up in list, can't get buffer number.
Solution:   Make the quickfix buffer unlisted when the quickfix window is
            closed.  get the quickfix buffer number with getqflist().
            (Yegappan Lakshmanan, closes #4113)
Files:      runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/quickfix.c,
            src/testdir/test_quickfix.vim, src/window.c


*** ../vim-8.1.1014/runtime/doc/eval.txt        2019-03-04 13:18:15.977053527 
+0100
--- runtime/doc/eval.txt        2019-03-17 16:34:27.019774609 +0100
***************
*** 4931,4940 ****
                If the optional {what} dictionary argument is supplied, then
                returns the items listed in {what} as a dictionary. Refer to
                |getqflist()| for the supported items in {what}.
!               If {what} contains 'filewinid', then returns the id of the
!               window used to display files from the location list. This
!               field is applicable only when called from a location list
!               window.
  
  getmatches()                                          *getmatches()*
                Returns a |List| with all matches previously defined by
--- 4964,4979 ----
                If the optional {what} dictionary argument is supplied, then
                returns the items listed in {what} as a dictionary. Refer to
                |getqflist()| for the supported items in {what}.
! 
!               In addition to the items supported by |getqflist()| in {what},
!               the following item is supported by |getloclist()|:
! 
!                       filewinid       id of the window used to display files
!                                       from the location list. This field is
!                                       applicable only when called from a
!                                       location list window. See
!                                       |location-list-file-window| for more
!                                       details.
  
  getmatches()                                          *getmatches()*
                Returns a |List| with all matches previously defined by
***************
*** 5036,5041 ****
--- 5075,5083 ----
                        nr      get information for this quickfix list; zero
                                means the current quickfix list and "$" means
                                the last quickfix list
+                       qfbufnr number of the buffer displayed in the quickfix
+                               window. Returns 0 if the quickfix buffer is
+                               not present. See |quickfix-buffer|.
                        size    number of entries in the quickfix list
                        title   get the list title |quickfix-title|
                        winid   get the quickfix |window-ID|
***************
*** 5064,5069 ****
--- 5106,5113 ----
                        items   quickfix list entries. If not present, set to
                                an empty list.
                        nr      quickfix list number. If not present, set to 0
+                       qfbufnr number of the buffer displayed in the quickfix
+                               window. If not present, set to 0.
                        size    number of entries in the quickfix list. If not
                                present, set to 0.
                        title   quickfix list title text. If not present, set
*** ../vim-8.1.1014/runtime/doc/quickfix.txt    2019-01-11 14:49:25.380107431 
+0100
--- runtime/doc/quickfix.txt    2019-03-17 16:34:27.019774609 +0100
***************
*** 111,124 ****
  :[count]lne[xt][!]    Same as ":cnext", except the location list for the
                        current window is used instead of the quickfix list.
  
! :[count]cN[ext][!]                    *:cp* *:cprevious* *:cN* *:cNext*
  :[count]cp[revious][!]        Display the [count] previous error in the list 
that
                        includes a file name.  If there are no file names at
                        all, go to the [count] previous error.  See |:cc| for
                        [!] and 'switchbuf'.
  
  
! :[count]lN[ext][!]                    *:lp* *:lprevious* *:lN* *:lNext*
  :[count]lp[revious][!]        Same as ":cNext" and ":cprevious", except the 
location
                        list for the current window is used instead of the
                        quickfix list.
--- 111,124 ----
  :[count]lne[xt][!]    Same as ":cnext", except the location list for the
                        current window is used instead of the quickfix list.
  
! :[count]cN[ext][!]            *:cp* *:cprevious*  *:cprev* *:cN* *:cNext*
  :[count]cp[revious][!]        Display the [count] previous error in the list 
that
                        includes a file name.  If there are no file names at
                        all, go to the [count] previous error.  See |:cc| for
                        [!] and 'switchbuf'.
  
  
! :[count]lN[ext][!]            *:lp* *:lprevious* *:lprev* *:lN* *:lNext*
  :[count]lp[revious][!]        Same as ":cNext" and ":cprevious", except the 
location
                        list for the current window is used instead of the
                        quickfix list.
***************
*** 367,374 ****
  <
                                                        *quickfix-index*
  When you jump to a quickfix/location list entry using any of the quickfix
! commands (e.g. |cc|, |cnext|, |cprev|, etc.), that entry becomes the currently
! selected entry. The index of the currently selected entry in a
  quickfix/location list can be obtained using the getqflist()/getloclist()
  functions. Examples: >
        echo getqflist({'idx' : 0}).idx
--- 367,374 ----
  <
                                                        *quickfix-index*
  When you jump to a quickfix/location list entry using any of the quickfix
! commands (e.g. |:cc|, |:cnext|, |:cprev|, etc.), that entry becomes the
! currently selected entry. The index of the currently selected entry in a
  quickfix/location list can be obtained using the getqflist()/getloclist()
  functions. Examples: >
        echo getqflist({'idx' : 0}).idx
***************
*** 496,501 ****
--- 496,502 ----
                        second quickfix window.  If [height] is given the
                        existing window will be resized to it.
  
+                                                       *quickfix-buffer*
                        The window will contain a special buffer, with
                        'buftype' equal to "quickfix".  Don't change this!
                        The window will have the w:quickfix_title variable set
***************
*** 504,510 ****
                        status line if the value of 'statusline' is adjusted
                        properly. Whenever this buffer is modified by a
                        quickfix command or function, the |b:changedtick|
!                       variable is incremented.
  
                                                        *:lop* *:lopen*
  :lop[en] [height]     Open a window to show the location list for the
--- 505,515 ----
                        status line if the value of 'statusline' is adjusted
                        properly. Whenever this buffer is modified by a
                        quickfix command or function, the |b:changedtick|
!                       variable is incremented.  You can get the number of
!                       this buffer using the getqflist() and getloclist()
!                       functions by passing the 'qfbufnr' item. For a
!                       location list, this buffer is wiped out when the
!                       location list is removed.
  
                                                        *:lop* *:lopen*
  :lop[en] [height]     Open a window to show the location list for the
***************
*** 670,681 ****
--- 675,692 ----
      " get the quickfix list window id
      :echo getqflist({'winid' : 0}).winid
  
+     " get the quickfix list window buffer number
+     :echo getqflist({'qfbufnr' : 0}).qfbufnr
+ 
      " get the context of the current location list
      :echo getloclist(0, {'context' : 0}).context
  
      " get the location list window id of the third window
      :echo getloclist(3, {'winid' : 0}).winid
  
+     " get the location list window buffer number of the third window
+     :echo getloclist(3, {'qfbufnr' : 0}).qfbufnr
+ 
      " get the file window id of a location list window (winnr: 4)
      :echo getloclist(4, {'filewinid' : 0}).filewinid
  <
*** ../vim-8.1.1014/src/quickfix.c      2019-03-13 06:49:20.492351919 +0100
--- src/quickfix.c      2019-03-17 16:34:27.019774609 +0100
***************
*** 5907,5913 ****
      QF_GETLIST_SIZE   = 0x80,
      QF_GETLIST_TICK   = 0x100,
      QF_GETLIST_FILEWINID      = 0x200,
!     QF_GETLIST_ALL    = 0x3FF,
  };
  
  /*
--- 5907,5914 ----
      QF_GETLIST_SIZE   = 0x80,
      QF_GETLIST_TICK   = 0x100,
      QF_GETLIST_FILEWINID      = 0x200,
!     QF_GETLIST_QFBUFNR        = 0x400,
!     QF_GETLIST_ALL    = 0x7FF,
  };
  
  /*
***************
*** 5977,5982 ****
--- 5978,5994 ----
  }
  
  /*
+  * Returns the number of the buffer displayed in the quickfix/location list
+  * window. If there is no buffer associated with the list, then returns 0.
+  */
+     static int
+ qf_getprop_qfbufnr(qf_info_T *qi, dict_T *retdict)
+ {
+     return dict_add_number(retdict, "qfbufnr",
+                                       (qi == NULL) ? 0 : qi->qf_bufnr);
+ }
+ 
+ /*
   * Convert the keys in 'what' to quickfix list property flags.
   */
      static int
***************
*** 6022,6027 ****
--- 6034,6042 ----
      if (loclist && dict_find(what, (char_u *)"filewinid", -1) != NULL)
        flags |= QF_GETLIST_FILEWINID;
  
+     if (dict_find(what, (char_u *)"qfbufnr", -1) != NULL)
+       flags |= QF_GETLIST_QFBUFNR;
+ 
      return flags;
  }
  
***************
*** 6114,6119 ****
--- 6129,6136 ----
        status = dict_add_number(retdict, "changedtick", 0);
      if ((status == OK) && locstack && (flags & QF_GETLIST_FILEWINID))
        status = dict_add_number(retdict, "filewinid", 0);
+     if ((status == OK) && (flags & QF_GETLIST_QFBUFNR))
+       status = qf_getprop_qfbufnr(qi, retdict);
  
      return status;
  }
***************
*** 6259,6264 ****
--- 6276,6283 ----
        status = dict_add_number(retdict, "changedtick", qfl->qf_changedtick);
      if ((status == OK) && (wp != NULL) && (flags & QF_GETLIST_FILEWINID))
        status = qf_getprop_filewinid(wp, qi, retdict);
+     if ((status == OK) && (flags & QF_GETLIST_QFBUFNR))
+       status = qf_getprop_qfbufnr(qi, retdict);
  
      return status;
  }
*** ../vim-8.1.1014/src/testdir/test_quickfix.vim       2019-03-02 
07:57:12.236395037 +0100
--- src/testdir/test_quickfix.vim       2019-03-17 16:34:27.019774609 +0100
***************
*** 3110,3128 ****
    call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
    if a:cchar == 'c'
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
!                 \ 'items' : [], 'nr' : 0, 'size' : 0,
                  \ 'title' : '', 'winid' : 0, 'changedtick': 0},
                  \ g:Xgetlist({'all' : 0}))
    else
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
                \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
!               \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0},
                \ g:Xgetlist({'all' : 0}))
    endif
  
    " Quickfix window with empty stack
    silent! Xopen
    let qfwinid = (a:cchar == 'c') ? win_getid() : 0
    call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
    Xclose
  
--- 3110,3130 ----
    call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
    if a:cchar == 'c'
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
!                 \ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
                  \ 'title' : '', 'winid' : 0, 'changedtick': 0},
                  \ g:Xgetlist({'all' : 0}))
    else
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
                \ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
!               \ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
!               \ 'qfbufnr' : 0},
                \ g:Xgetlist({'all' : 0}))
    endif
  
    " Quickfix window with empty stack
    silent! Xopen
    let qfwinid = (a:cchar == 'c') ? win_getid() : 0
+   let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
    call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
    Xclose
  
***************
*** 3154,3164 ****
    if a:cchar == 'c'
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
                \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
    else
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
!               \ 'changedtick' : 0, 'filewinid' : 0},
                \ g:Xgetlist({'id' : qfid, 'all' : 0}))
    endif
  
--- 3156,3167 ----
    if a:cchar == 'c'
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
+               \ 'qfbufnr' : qfbufnr,
                \ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
    else
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
!               \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
                \ g:Xgetlist({'id' : qfid, 'all' : 0}))
    endif
  
***************
*** 3175,3185 ****
    if a:cchar == 'c'
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
!               \ 'changedtick' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
    else
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
!               \ 'changedtick' : 0, 'filewinid' : 0},
                \ g:Xgetlist({'nr' : 5, 'all' : 0}))
    endif
  endfunc
--- 3178,3189 ----
    if a:cchar == 'c'
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
!               \ 'changedtick' : 0, 'qfbufnr' : qfbufnr},
!               \ g:Xgetlist({'nr' : 5, 'all' : 0}))
    else
      call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
                \ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
!               \ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
                \ g:Xgetlist({'nr' : 5, 'all' : 0}))
    endif
  endfunc
***************
*** 3912,3917 ****
--- 3916,3922 ----
    Xclose
    " Even after the quickfix window is closed, the buffer should be loaded
    call assert_true(bufloaded(qfbnum))
+   call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
    Xopen
    " Buffer should be reused when opening the window again
    call assert_equal(qfbnum, bufnr(''))
***************
*** 3930,3936 ****
      close
      " When the location list window is closed, the buffer name should not
      " change to 'Quickfix List'
!     call assert_match(qfbnum . '  h-  "\[Location List]"', execute('ls'))
      call assert_true(bufloaded(qfbnum))
  
      " After deleting a location list buffer using ":bdelete", opening the
--- 3935,3941 ----
      close
      " When the location list window is closed, the buffer name should not
      " change to 'Quickfix List'
!     call assert_match(qfbnum . 'u h-  "\[Location List]"', execute('ls!'))
      call assert_true(bufloaded(qfbnum))
  
      " After deleting a location list buffer using ":bdelete", opening the
***************
*** 3947,3952 ****
--- 3952,3958 ----
      " removed
      call setloclist(0, [], 'f')
      call assert_false(bufexists(qfbnum))
+     call assert_equal(0, getloclist(0, {'qfbufnr' : 0}).qfbufnr)
  
      " When the location list is freed with the location list window open, the
      " location list buffer should not be lost. It should be reused when the
*** ../vim-8.1.1014/src/window.c        2019-03-04 13:18:15.973053562 +0100
--- src/window.c        2019-03-17 16:36:49.002856677 +0100
***************
*** 2382,2399 ****
      }
  
  #ifdef FEAT_GUI
!     /* Avoid trouble with scrollbars that are going to be deleted in
!      * win_free(). */
      if (gui.in_use)
        out_flush();
  #endif
  
  #ifdef FEAT_SYN_HL
!     /* Free independent synblock before the buffer is freed. */
      if (win->w_buffer != NULL)
        reset_synblock(win);
  #endif
  
      /*
       * Close the link to the buffer.
       */
--- 2382,2405 ----
      }
  
  #ifdef FEAT_GUI
!     // Avoid trouble with scrollbars that are going to be deleted in
!     // win_free().
      if (gui.in_use)
        out_flush();
  #endif
  
  #ifdef FEAT_SYN_HL
!     // Free independent synblock before the buffer is freed.
      if (win->w_buffer != NULL)
        reset_synblock(win);
  #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))
+       win->w_buffer->b_p_bl = FALSE;
+ #endif
+ 
      /*
       * Close the link to the buffer.
       */
*** ../vim-8.1.1014/src/version.c       2019-03-17 15:47:22.589492071 +0100
--- src/version.c       2019-03-17 16:33:12.068262826 +0100
***************
*** 781,782 ****
--- 781,784 ----
  {   /* Add new patch number below this line */
+ /**/
+     1015,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
79. All of your most erotic dreams have a scrollbar at the right side.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui