mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.1.1015: quickfix buffer shows up in list, can't get buffer number
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 vim/vim#4113)
647e24ba3d
This commit is contained in:
parent
9606317486
commit
4cd69151cf
@ -3170,7 +3170,7 @@ complete_info([{what}])
|
|||||||
<
|
<
|
||||||
*confirm()*
|
*confirm()*
|
||||||
confirm({msg} [, {choices} [, {default} [, {type}]]])
|
confirm({msg} [, {choices} [, {default} [, {type}]]])
|
||||||
Confirm() offers the user a dialog, from which a choice can be
|
confirm() offers the user a dialog, from which a choice can be
|
||||||
made. It returns the number of the choice. For the first
|
made. It returns the number of the choice. For the first
|
||||||
choice this is 1.
|
choice this is 1.
|
||||||
|
|
||||||
@ -4639,10 +4639,16 @@ getloclist({nr},[, {what}]) *getloclist()*
|
|||||||
If the optional {what} dictionary argument is supplied, then
|
If the optional {what} dictionary argument is supplied, then
|
||||||
returns the items listed in {what} as a dictionary. Refer to
|
returns the items listed in {what} as a dictionary. Refer to
|
||||||
|getqflist()| for the supported items in {what}.
|
|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
|
In addition to the items supported by |getqflist()| in {what},
|
||||||
field is applicable only when called from a location list
|
the following item is supported by |getloclist()|:
|
||||||
window. See |location-list-file-window| for more details.
|
|
||||||
|
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([{win}]) *getmatches()*
|
getmatches([{win}]) *getmatches()*
|
||||||
Returns a |List| with all matches previously defined for the
|
Returns a |List| with all matches previously defined for the
|
||||||
@ -4744,6 +4750,9 @@ getqflist([{what}]) *getqflist()*
|
|||||||
nr get information for this quickfix list; zero
|
nr get information for this quickfix list; zero
|
||||||
means the current quickfix list and "$" means
|
means the current quickfix list and "$" means
|
||||||
the last quickfix list
|
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
|
size number of entries in the quickfix list
|
||||||
title get the list title |quickfix-title|
|
title get the list title |quickfix-title|
|
||||||
winid get the quickfix |window-ID|
|
winid get the quickfix |window-ID|
|
||||||
@ -4772,6 +4781,8 @@ getqflist([{what}]) *getqflist()*
|
|||||||
items quickfix list entries. If not present, set to
|
items quickfix list entries. If not present, set to
|
||||||
an empty list.
|
an empty list.
|
||||||
nr quickfix list number. If not present, set to 0
|
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
|
size number of entries in the quickfix list. If not
|
||||||
present, set to 0.
|
present, set to 0.
|
||||||
title quickfix list title text. If not present, set
|
title quickfix list title text. If not present, set
|
||||||
@ -10378,14 +10389,14 @@ text...
|
|||||||
commands are skipped.
|
commands are skipped.
|
||||||
When {pattern} is omitted all errors are caught.
|
When {pattern} is omitted all errors are caught.
|
||||||
Examples: >
|
Examples: >
|
||||||
:catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
|
:catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
|
||||||
:catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
|
:catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
|
||||||
:catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
|
:catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
|
||||||
:catch /^Vim(write):/ " catch all errors in :write
|
:catch /^Vim(write):/ " catch all errors in :write
|
||||||
:catch /^Vim\%((\a\+)\)\=:E123/ " catch error E123
|
:catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
|
||||||
:catch /my-exception/ " catch user exception
|
:catch /my-exception/ " catch user exception
|
||||||
:catch /.*/ " catch everything
|
:catch /.*/ " catch everything
|
||||||
:catch " same as /.*/
|
:catch " same as /.*/
|
||||||
<
|
<
|
||||||
Another character can be used instead of / around the
|
Another character can be used instead of / around the
|
||||||
{pattern}, so long as it does not have a special
|
{pattern}, so long as it does not have a special
|
||||||
|
@ -540,6 +540,7 @@ location list.
|
|||||||
second quickfix window. If [height] is given the
|
second quickfix window. If [height] is given the
|
||||||
existing window will be resized to it.
|
existing window will be resized to it.
|
||||||
|
|
||||||
|
*quickfix-buffer*
|
||||||
The window will contain a special buffer, with
|
The window will contain a special buffer, with
|
||||||
'buftype' equal to "quickfix". Don't change this!
|
'buftype' equal to "quickfix". Don't change this!
|
||||||
The window will have the w:quickfix_title variable set
|
The window will have the w:quickfix_title variable set
|
||||||
@ -548,7 +549,11 @@ location list.
|
|||||||
status line if the value of 'statusline' is adjusted
|
status line if the value of 'statusline' is adjusted
|
||||||
properly. Whenever this buffer is modified by a
|
properly. Whenever this buffer is modified by a
|
||||||
quickfix command or function, the |b:changedtick|
|
quickfix command or function, the |b:changedtick|
|
||||||
variable is incremented.
|
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* *:lopen*
|
||||||
:lop[en] [height] Open a window to show the location list for the
|
:lop[en] [height] Open a window to show the location list for the
|
||||||
@ -714,12 +719,18 @@ using these functions are below:
|
|||||||
" get the quickfix list window id
|
" get the quickfix list window id
|
||||||
:echo getqflist({'winid' : 0}).winid
|
: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
|
" get the context of the current location list
|
||||||
:echo getloclist(0, {'context' : 0}).context
|
:echo getloclist(0, {'context' : 0}).context
|
||||||
|
|
||||||
" get the location list window id of the third window
|
" get the location list window id of the third window
|
||||||
:echo getloclist(3, {'winid' : 0}).winid
|
: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)
|
" get the file window id of a location list window (winnr: 4)
|
||||||
:echo getloclist(4, {'filewinid' : 0}).filewinid
|
:echo getloclist(4, {'filewinid' : 0}).filewinid
|
||||||
<
|
<
|
||||||
|
@ -5577,7 +5577,8 @@ enum {
|
|||||||
QF_GETLIST_SIZE = 0x80,
|
QF_GETLIST_SIZE = 0x80,
|
||||||
QF_GETLIST_TICK = 0x100,
|
QF_GETLIST_TICK = 0x100,
|
||||||
QF_GETLIST_FILEWINID = 0x200,
|
QF_GETLIST_FILEWINID = 0x200,
|
||||||
QF_GETLIST_ALL = 0x3FF,
|
QF_GETLIST_QFBUFNR = 0x400,
|
||||||
|
QF_GETLIST_ALL = 0x7FF,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Parse text from 'di' and return the quickfix list items.
|
/// Parse text from 'di' and return the quickfix list items.
|
||||||
@ -5632,6 +5633,15 @@ static int qf_winid(qf_info_T *qi)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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(const qf_info_T *qi, dict_T *retdict)
|
||||||
|
FUNC_ATTR_NONNULL_ARG(2)
|
||||||
|
{
|
||||||
|
return tv_dict_add_nr(retdict, S_LEN("qfbufnr"),
|
||||||
|
(qi == NULL) ? 0 : qi->qf_bufnr);
|
||||||
|
}
|
||||||
|
|
||||||
/// Convert the keys in 'what' to quickfix list property flags.
|
/// Convert the keys in 'what' to quickfix list property flags.
|
||||||
static int qf_getprop_keys2flags(const dict_T *what, bool loclist)
|
static int qf_getprop_keys2flags(const dict_T *what, bool loclist)
|
||||||
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
||||||
@ -5675,6 +5685,9 @@ static int qf_getprop_keys2flags(const dict_T *what, bool loclist)
|
|||||||
if (loclist && tv_dict_find(what, S_LEN("filewinid")) != NULL) {
|
if (loclist && tv_dict_find(what, S_LEN("filewinid")) != NULL) {
|
||||||
flags |= QF_GETLIST_FILEWINID;
|
flags |= QF_GETLIST_FILEWINID;
|
||||||
}
|
}
|
||||||
|
if (tv_dict_find(what, S_LEN("qfbufnr")) != NULL) {
|
||||||
|
flags |= QF_GETLIST_QFBUFNR;
|
||||||
|
}
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
@ -5766,6 +5779,9 @@ static int qf_getprop_defaults(qf_info_T *qi,
|
|||||||
if ((status == OK) && locstack && (flags & QF_GETLIST_FILEWINID)) {
|
if ((status == OK) && locstack && (flags & QF_GETLIST_FILEWINID)) {
|
||||||
status = tv_dict_add_nr(retdict, S_LEN("filewinid"), 0);
|
status = tv_dict_add_nr(retdict, S_LEN("filewinid"), 0);
|
||||||
}
|
}
|
||||||
|
if ((status == OK) && (flags & QF_GETLIST_QFBUFNR)) {
|
||||||
|
status = qf_getprop_qfbufnr(qi, retdict);
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -5900,6 +5916,9 @@ int qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
if ((status == OK) && (wp != NULL) && (flags & QF_GETLIST_FILEWINID)) {
|
if ((status == OK) && (wp != NULL) && (flags & QF_GETLIST_FILEWINID)) {
|
||||||
status = qf_getprop_filewinid(wp, qi, retdict);
|
status = qf_getprop_filewinid(wp, qi, retdict);
|
||||||
}
|
}
|
||||||
|
if ((status == OK) && (flags & QF_GETLIST_QFBUFNR)) {
|
||||||
|
status = qf_getprop_qfbufnr(qi, retdict);
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -3217,19 +3217,21 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
|
call assert_equal(0, g:Xgetlist({'changedtick' : 0}).changedtick)
|
||||||
if a:cchar == 'c'
|
if a:cchar == 'c'
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
|
||||||
\ 'items' : [], 'nr' : 0, 'size' : 0,
|
\ 'items' : [], 'nr' : 0, 'size' : 0, 'qfbufnr' : 0,
|
||||||
\ 'title' : '', 'winid' : 0, 'changedtick': 0},
|
\ 'title' : '', 'winid' : 0, 'changedtick': 0},
|
||||||
\ g:Xgetlist({'all' : 0}))
|
\ g:Xgetlist({'all' : 0}))
|
||||||
else
|
else
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0,
|
||||||
\ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
|
\ 'items' : [], 'nr' : 0, 'size' : 0, 'title' : '',
|
||||||
\ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0},
|
\ 'winid' : 0, 'changedtick': 0, 'filewinid' : 0,
|
||||||
|
\ 'qfbufnr' : 0},
|
||||||
\ g:Xgetlist({'all' : 0}))
|
\ g:Xgetlist({'all' : 0}))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Quickfix window with empty stack
|
" Quickfix window with empty stack
|
||||||
silent! Xopen
|
silent! Xopen
|
||||||
let qfwinid = (a:cchar == 'c') ? win_getid() : 0
|
let qfwinid = (a:cchar == 'c') ? win_getid() : 0
|
||||||
|
let qfbufnr = (a:cchar == 'c') ? bufnr('') : 0
|
||||||
call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
|
call assert_equal(qfwinid, g:Xgetlist({'winid' : 0}).winid)
|
||||||
Xclose
|
Xclose
|
||||||
|
|
||||||
@ -3261,11 +3263,12 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
if a:cchar == 'c'
|
if a:cchar == 'c'
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
||||||
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
||||||
|
\ 'qfbufnr' : qfbufnr,
|
||||||
\ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
|
\ 'changedtick' : 0}, g:Xgetlist({'id' : qfid, 'all' : 0}))
|
||||||
else
|
else
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
||||||
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
||||||
\ 'changedtick' : 0, 'filewinid' : 0},
|
\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
|
||||||
\ g:Xgetlist({'id' : qfid, 'all' : 0}))
|
\ g:Xgetlist({'id' : qfid, 'all' : 0}))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -3282,11 +3285,12 @@ func Xgetlist_empty_tests(cchar)
|
|||||||
if a:cchar == 'c'
|
if a:cchar == 'c'
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
||||||
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
||||||
\ 'changedtick' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
|
\ 'changedtick' : 0, 'qfbufnr' : qfbufnr},
|
||||||
|
\ g:Xgetlist({'nr' : 5, 'all' : 0}))
|
||||||
else
|
else
|
||||||
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [],
|
||||||
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
\ 'nr' : 0, 'size' : 0, 'title' : '', 'winid' : 0,
|
||||||
\ 'changedtick' : 0, 'filewinid' : 0},
|
\ 'changedtick' : 0, 'filewinid' : 0, 'qfbufnr' : 0},
|
||||||
\ g:Xgetlist({'nr' : 5, 'all' : 0}))
|
\ g:Xgetlist({'nr' : 5, 'all' : 0}))
|
||||||
endif
|
endif
|
||||||
endfunc
|
endfunc
|
||||||
@ -4040,6 +4044,7 @@ func Xqfbuf_test(cchar)
|
|||||||
Xclose
|
Xclose
|
||||||
" Even after the quickfix window is closed, the buffer should be loaded
|
" Even after the quickfix window is closed, the buffer should be loaded
|
||||||
call assert_true(bufloaded(qfbnum))
|
call assert_true(bufloaded(qfbnum))
|
||||||
|
call assert_true(qfbnum, g:Xgetlist({'qfbufnr' : 0}).qfbufnr)
|
||||||
Xopen
|
Xopen
|
||||||
" Buffer should be reused when opening the window again
|
" Buffer should be reused when opening the window again
|
||||||
call assert_equal(qfbnum, bufnr(''))
|
call assert_equal(qfbnum, bufnr(''))
|
||||||
@ -4058,7 +4063,7 @@ func Xqfbuf_test(cchar)
|
|||||||
close
|
close
|
||||||
" When the location list window is closed, the buffer name should not
|
" When the location list window is closed, the buffer name should not
|
||||||
" change to 'Quickfix List'
|
" change to 'Quickfix List'
|
||||||
call assert_match(qfbnum . ' h- "\[Location List]"', execute('ls'))
|
call assert_match(qfbnum . 'u h- "\[Location List]"', execute('ls!'))
|
||||||
call assert_true(bufloaded(qfbnum))
|
call assert_true(bufloaded(qfbnum))
|
||||||
|
|
||||||
" After deleting a location list buffer using ":bdelete", opening the
|
" After deleting a location list buffer using ":bdelete", opening the
|
||||||
@ -4075,6 +4080,7 @@ func Xqfbuf_test(cchar)
|
|||||||
" removed
|
" removed
|
||||||
call setloclist(0, [], 'f')
|
call setloclist(0, [], 'f')
|
||||||
call assert_false(bufexists(qfbnum))
|
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
|
" 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
|
" location list buffer should not be lost. It should be reused when the
|
||||||
|
@ -2578,9 +2578,14 @@ int win_close(win_T *win, bool free_buf)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free independent synblock before the buffer is freed. */
|
// Free independent synblock before the buffer is freed.
|
||||||
if (win->w_buffer != NULL)
|
if (win->w_buffer != NULL) {
|
||||||
reset_synblock(win);
|
reset_synblock(win);
|
||||||
|
}
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close the link to the buffer.
|
* Close the link to the buffer.
|
||||||
|
Loading…
Reference in New Issue
Block a user