Hi,

The attached patch adds support for getting the index of the current
entry in a quickfix/location list and the size of the list.

The following sample shows how to get the current index:

      echo getqflist({'idx' : 0})

The following sample shows how to get the size:

      echo getqflist({'size' : 0})

- 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 eb4eba0c6..1650ee804 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -4642,6 +4642,7 @@ getqflist([{what}])                                       
*getqflist()*
                        id      get information for the quickfix list with
                                |quickfix-ID|; zero means the id for the
                                current list or the list specifed by "nr"
+                       idx     index of the current entry in the list
                        items   quickfix list entries
                        lines   use 'errorformat' to extract items from a list
                                of lines and return the resulting entries.
@@ -4650,6 +4651,7 @@ getqflist([{what}])                                       
*getqflist()*
                        nr      get information for this quickfix list; zero
                                means the current quickfix list and "$" means
                                the last quickfix list
+                       size    number of entries in the quickfix list
                        title   get the list title
                        winid   get the |window-ID| (if opened)
                        all     all of the above quickfix properties
@@ -4669,8 +4671,10 @@ getqflist([{what}])                                      
*getqflist()*
                The returned dictionary contains the following entries:
                        context context information stored with |setqflist()|
                        id      quickfix list ID |quickfix-ID|
+                       idx     index of the current entry in the list
                        items   quickfix list entries
                        nr      quickfix list number
+                       size    number of entries in the quickfix list
                        title   quickfix list title text
                        winid   quickfix |window-ID| (if opened)
 
diff --git a/src/quickfix.c b/src/quickfix.c
index 5ff4091d5..39eb5b63a 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2212,8 +2212,7 @@ qf_jump(qf_info_T *qi,
     old_qf_ptr = qf_ptr;
     qf_index = qi->qf_lists[qi->qf_curlist].qf_index;
     old_qf_index = qf_index;
-    if (dir == FORWARD || dir == FORWARD_FILE ||
-       dir == BACKWARD || dir == BACKWARD_FILE)    /* next/prev valid entry */
+    if (dir != 0)    /* next/prev valid entry */
     {
        qf_ptr = get_nth_valid_entry(qi, errornr, qf_ptr, &qf_index, dir);
        if (qf_ptr == NULL)
@@ -4726,6 +4725,8 @@ enum {
     QF_GETLIST_WINID   = 0x8,
     QF_GETLIST_CONTEXT = 0x10,
     QF_GETLIST_ID      = 0x20,
+    QF_GETLIST_IDX     = 0x40,
+    QF_GETLIST_SIZE    = 0x80,
     QF_GETLIST_ALL     = 0xFF
 };
 
@@ -4882,6 +4883,12 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T 
*retdict)
     if (dict_find(what, (char_u *)"items", -1) != NULL)
        flags |= QF_GETLIST_ITEMS;
 
+    if (dict_find(what, (char_u *)"idx", -1) != NULL)
+       flags |= QF_GETLIST_IDX;
+
+    if (dict_find(what, (char_u *)"size", -1) != NULL)
+       flags |= QF_GETLIST_SIZE;
+
     if (flags & QF_GETLIST_TITLE)
     {
        char_u  *t;
@@ -4934,6 +4941,19 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T 
*retdict)
        status = dict_add_nr_str(retdict, "id", qi->qf_lists[qf_idx].qf_id,
                                                                         NULL);
 
+    if ((status == OK) && (flags & QF_GETLIST_IDX))
+    {
+       int idx = qi->qf_lists[qf_idx].qf_index;
+       if (qi->qf_lists[qf_idx].qf_count == 0)
+           /* For empty lists, qf_index is set to 1 */
+           idx = 0;
+       status = dict_add_nr_str(retdict, "idx", idx, NULL);
+    }
+
+    if ((status == OK) && (flags & QF_GETLIST_SIZE))
+       status = dict_add_nr_str(retdict, "size",
+                                       qi->qf_lists[qf_idx].qf_count, NULL);
+
     return status;
 }
 
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 671381ce1..90a51050d 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -430,6 +430,19 @@ func Xtest_browse(cchar)
 
   call delete('Xqftestfile1')
   call delete('Xqftestfile2')
+
+  " Should be able to use next/prev with invalid entries
+  Xexpr ""
+  call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
+  call assert_equal(0, g:Xgetlist({'size' : 0}).size)
+  Xaddexpr ['foo', 'bar', 'baz', 'quux', 'shmoo']
+  call assert_equal(5, g:Xgetlist({'size' : 0}).size)
+  Xlast
+  call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
+  Xfirst
+  call assert_equal(1, g:Xgetlist({'idx' : 0}).idx)
+  2Xnext
+  call assert_equal(3, g:Xgetlist({'idx' : 0}).idx)
 endfunc
 
 func Test_browse()

Raspunde prin e-mail lui