To: vim_dev@googlegroups.com Subject: Patch 8.1.1015 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///