Hi,

I am attaching a patch to refer to the last quickfix list in the quickfix
stack by using "$" as the quickfix list number (when calling the
getqflist(), getloclist(), setqflist() and setloclist() functions).
This makes it easier to get the current size of the quickfix stack.

- Yegappan

-- 
-- 
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.
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 6a0013ab9..585b78d3f 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -4586,12 +4586,16 @@ getqflist([{what}])                                     
*getqflist()*
                following string items are supported in {what}:
                        context get the context stored with |setqflist()|
                        nr      get information for this quickfix list; zero
-                               means the current quickfix list
+                               means the current quickfix list and '$' means
+                               the last quickfix list
                        title   get the list title
                        winid   get the |window-ID| (if opened)
                        all     all of the above quickfix properties
                Non-string items in {what} are ignored.
                If "nr" is not present then the current quickfix list is used.
+               To get the number of lists in the quickfix stack, set 'nr' to
+               '$' in {what}. The 'nr' value in the returned dictionary
+               contains the quickfix stack size.
                In case of error processing {what}, an empty dictionary is
                returned.
 
@@ -6990,7 +6994,9 @@ setqflist({list} [, {action}[, {what}]])          
*setqflist()*
                argument is ignored.  The following items can be specified in
                {what}:
                    context     any Vim type can be stored as a context
-                   nr          list number in the quickfix stack
+                   nr          list number in the quickfix stack; zero
+                               means the current quickfix list and '$' means
+                               the last quickfix list
                    title       quickfix list title text
                Unsupported keys in {what} are ignored.
                If the "nr" item is not present, then the current quickfix list
diff --git a/src/quickfix.c b/src/quickfix.c
index b1a5ebdc1..a4c78f4ce 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4670,7 +4670,14 @@ get_errorlist_properties(win_T *wp, dict_T *what, dict_T 
*retdict)
     {
        qi = GET_LOC_LIST(wp);
        if (qi == NULL)
+       {
+           /* If querying for the size of the location list, return 0 */
+           if (((di = dict_find(what, (char_u *)"nr", -1)) != NULL) &&
+                   (di->di_tv.v_type == VAR_STRING) &&
+                   (STRCMP(di->di_tv.vval.v_string, "$") == 0))
+                   return dict_add_nr_str(retdict, "nr", 0, NULL);
            return FAIL;
+       }
     }
 
     qf_idx = qi->qf_curlist;           /* default is the current list */
@@ -4685,6 +4692,18 @@ get_errorlist_properties(win_T *wp, dict_T *what, dict_T 
*retdict)
                qf_idx = di->di_tv.vval.v_number - 1;
                if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
                    return FAIL;
+           } else if (qi->qf_listcount == 0)       /* stack is empty */
+               return FAIL;
+           flags |= QF_GETLIST_NR;
+       } else if ((di->di_tv.v_type == VAR_STRING) &&
+               (STRCMP(di->di_tv.vval.v_string, "$") == 0))
+       {
+           {
+               /* Get the last quickfix list number */
+               if (qi->qf_listcount > 0)
+                   qf_idx = qi->qf_listcount - 1;
+               else
+                   qf_idx = -1;        /* Quickfix stack is empty */
            }
            flags |= QF_GETLIST_NR;
        }
@@ -4692,17 +4711,20 @@ get_errorlist_properties(win_T *wp, dict_T *what, 
dict_T *retdict)
            return FAIL;
     }
 
-    if (dict_find(what, (char_u *)"all", -1) != NULL)
-       flags |= QF_GETLIST_ALL;
+    if (qf_idx != -1)
+    {
+       if (dict_find(what, (char_u *)"all", -1) != NULL)
+           flags |= QF_GETLIST_ALL;
 
-    if (dict_find(what, (char_u *)"title", -1) != NULL)
-       flags |= QF_GETLIST_TITLE;
+       if (dict_find(what, (char_u *)"title", -1) != NULL)
+           flags |= QF_GETLIST_TITLE;
 
-    if (dict_find(what, (char_u *)"winid", -1) != NULL)
-       flags |= QF_GETLIST_WINID;
+       if (dict_find(what, (char_u *)"winid", -1) != NULL)
+           flags |= QF_GETLIST_WINID;
 
-    if (dict_find(what, (char_u *)"context", -1) != NULL)
-       flags |= QF_GETLIST_CONTEXT;
+       if (dict_find(what, (char_u *)"context", -1) != NULL)
+           flags |= QF_GETLIST_CONTEXT;
+    }
 
     if (flags & QF_GETLIST_TITLE)
     {
@@ -4895,7 +4917,10 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int 
action)
                qf_idx = di->di_tv.vval.v_number - 1;
            if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
                return FAIL;
-       }
+       } else if (di->di_tv.v_type == VAR_STRING &&
+               STRCMP(di->di_tv.vval.v_string, "$") == 0 &&
+               qi->qf_listcount > 0)
+           qf_idx = qi->qf_listcount - 1;
        else
            return FAIL;
        newlist = FALSE;        /* use the specified list */
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 51f6a6f7c..d88993a9c 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -2120,3 +2120,31 @@ func Test_bufoverflow()
   set efm&vim
 endfunc
 
+" Tests for getting the quickfix stack size
+func XsizeTests(cchar)
+  call s:setup_commands(a:cchar)
+
+  call g:Xsetlist([], 'f')
+  call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
+  call assert_equal(1, len(g:Xgetlist({'nr':'$', 'all':1})))
+  call assert_equal(0, len(g:Xgetlist({'nr':0})))
+
+  Xexpr "File1:10:Line1"
+  Xexpr "File2:20:Line2"
+  Xexpr "File3:30:Line3"
+  Xolder | Xolder
+  call assert_equal(3, g:Xgetlist({'nr':'$'}).nr)
+  call g:Xsetlist([], 'f')
+
+  Xexpr "File1:10:Line1"
+  Xexpr "File2:20:Line2"
+  Xexpr "File3:30:Line3"
+  Xolder | Xolder
+  call g:Xsetlist([], 'a', {'nr':'$', 'title':'Compiler'})
+  call assert_equal('Compiler', g:Xgetlist({'nr':3, 'all':1}).title)
+endfunc
+
+func Test_Qf_Size()
+  call XsizeTests('c')
+  call XsizeTests('l')
+endfunc

Raspunde prin e-mail lui