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.