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

Raspunde prin e-mail lui