summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-09-15 22:43:07 +0200
committerBram Moolenaar <Bram@vim.org>2017-09-15 22:43:07 +0200
commitfc2b270cfd36230166df486aae4d96d9d1f32755 (patch)
tree5ac8fa6f9e68be4fcbe41fc046f1e0734a0a649a
parentb5e79ef5a9e85f5bb70eb4cc6e12cbeec2a820ca (diff)
patch 8.0.1112: can't get size or current index from quickfix listv8.0.1112
Problem: Can't get size or current index from quickfix list. Solution: Add "idx" and "size" options. (Yegappan Lakshmanan)
-rw-r--r--runtime/doc/eval.txt4
-rw-r--r--src/quickfix.c24
-rw-r--r--src/testdir/test_quickfix.vim13
-rw-r--r--src/version.c2
4 files changed, 41 insertions, 2 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index eb4eba0c65..1650ee804b 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 5ff4091d59..39eb5b63a2 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 671381ce19..90a51050d0 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()
diff --git a/src/version.c b/src/version.c
index 8546911982..ce9d2c2499 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1112,
+/**/
1111,
/**/
1110,