# HG changeset patch # User Christian Brabandt # Date 1505508304 -7200 # Node ID 805f7fd40e0d9d8d787014ea4a3e09930fa4e5cc # Parent ab743b602cd7ee87a809ef6248da650862720f10 patch 8.0.1112: can't get size or current index from quickfix list commit https://github.com/vim/vim/commit/fc2b270cfd36230166df486aae4d96d9d1f32755 Author: Bram Moolenaar Date: Fri Sep 15 22:43:07 2017 +0200 patch 8.0.1112: can't get size or current index from quickfix list Problem: Can't get size or current index from quickfix list. Solution: Add "idx" and "size" options. (Yegappan Lakshmanan) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- 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 --- 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 *wha 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 *wha 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 --- 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 --- 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,