Hello Vim developers,
The :cwindow command is supposed to close the quickfix window when "there are no
recognized errors". I think I found two bugs (in Vim 7.3.146 on Linux/x86, but
reproducible even in Vim 7.0 and on MS Windows).
First:
vim -N -u NONE
:call setqflist([])
:cwindow
" quickfix window doesn't open, as expected
:call setqflist([], 'r')
:cwindow
" empty quickfix window opens: unexpected!
:echo getqflist()
[]
I'm totally new to the quickfix implementation, but I was able to fix this by
checking qf_count instead of qf_index (which seems to contain a previous value
in the "replace" case of setqflist()). Hopefully someone with more insights into
the different members of the struct can confirm this.
diff -r 24b41d74f6a9 src/quickfix.c
--- a/src/quickfix.c Sun Mar 27 16:03:15 2011 +0200
+++ b/src/quickfix.c Fri Apr 15 15:03:52 2011 +0200
@@ -3699,7 +3699,7 @@
}
}
- if (qi->qf_lists[qi->qf_curlist].qf_index == 0)
+ if (qi->qf_lists[qi->qf_curlist].qf_count == 0)
/* empty list or no valid entry */
qi->qf_lists[qi->qf_curlist].qf_nonevalid = TRUE;
else
Second: A :vimgrep that yields no matches causes :cwindow to open an empty
quickfix window, whereas :make and :grep correctly make :cwindow close / keep
the window closed.
vim -N -u NONE
:vimgrep doesnotexist /etc/passwd
" On Windows, use :vimgrep doesnotexist NUL
E480: No match: doesnotexist
:cwindow
" empty quickfix window opens: unexpected!
:echo getqflist()
[]
I found two approaches to fix that: Either by explicitly making :cwindow check
for an empty number of items:
diff -r 24b41d74f6a9 src/quickfix.c
--- a/src/quickfix.c Sun Mar 27 16:03:15 2011 +0200
+++ b/src/quickfix.c Fri Apr 15 14:43:18 2011 +0200
@@ -2243,6 +2243,7 @@
* it if we have errors; otherwise, leave it closed.
*/
if (qi->qf_lists[qi->qf_curlist].qf_nonevalid
+ || qi->qf_lists[qi->qf_curlist].qf_count == 0
|| qi->qf_curlist >= qi->qf_listcount)
{
if (win != NULL)
But, as this doesn't seem to be necessary for all the other commands that fill
the quickfix list, I think it's more appropriate to make :vimgrep set the
qf_nonevalid flag when there were no matches:
diff -r 24b41d74f6a9 src/quickfix.c
--- a/src/quickfix.c Sun Mar 27 16:03:15 2011 +0200
+++ b/src/quickfix.c Fri Apr 15 15:03:52 2011 +0200
@@ -3312,7 +3312,7 @@
FreeWild(fcount, fnames);
- qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
+ qi->qf_lists[qi->qf_curlist].qf_nonevalid =
((qi->qf_lists[qi->qf_curlist].qf_count > 0) ? FALSE : TRUE);
qi->qf_lists[qi->qf_curlist].qf_ptr =
qi->qf_lists[qi->qf_curlist].qf_start;
qi->qf_lists[qi->qf_curlist].qf_index = 1;
Again, I hope for the insights of developers more familiar with the code.
-- regards, ingo
--
-- Ingo Karkat -- /^-- /^-- /^-- /^-- /^-- /^-- http://ingo-karkat.de/ --
-- http://vim.sourceforge.net/account/profile.php?user_id=9713 --
--
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