Hi,

On Sun, Apr 17, 2016 at 11:38 AM, Yegappan Lakshmanan
<[email protected]> wrote:
> Hi,
>
> On Sun, Apr 17, 2016 at 3:35 AM, Ramel Eshed <[email protected]> wrote:
>> On Sunday, April 17, 2016 at 3:12:55 AM UTC+3, [email protected] wrote:
>>> Hi,
>>>
>>> On Sat, Apr 16, 2016 at 3:43 PM, Yegappan Lakshmanan
>>> <[email protected]> wrote:
>>> > Hi,
>>> >
>>> > On Sat, Apr 16, 2016 at 12:52 PM, Ramel Eshed <[email protected]> wrote:
>>> >> Adding an item to the current quickfix list causes a jump to the first 
>>> >> item rather than keeping the current context:
>>> >>
>>> >> Download the attached file;
>>> >> vim -u NONE -N
>>> >> :source qf_test.vim
>>> >>
>>> >> -After adding 2 items, :cn, adding one more item and another :cn we are 
>>> >> in (2 of 3) instead of (3 of 3).
>>> >>
>>> >
>>> > The setqflist() function resets the index of the quickfix list so that it
>>> > points to the first entry (even if entries are appended to the list).
>>> >
>>> > Due to a bug in the set_errorlist() function, the index is set to 1 
>>> > instead
>>> > of zero. That is why, you saw 2 of 3 instead of 1 of 3.
>>> >
>>>
>>> The quickfix index is 1 based and not zero based. The current code correctly
>>> sets the index to 1. So there is no bug in the current code.
>>>
>>> The documentation for the setqflist() function needs to be updated to
>>> state that it will reset to the first valid entry.
>>>
>>> - Yegappan
>>
>> Is there any reason to reset the pointer each time? I think that it is
>> more reasonable to leave the pointer as it when adding to the list so
>> it’d be possible to work with the list and adding new items to it when
>> they’re available without losing the context.
>>
>
> Agreed. I will send out a patch later today for this.
>

A patch with tests is attached.

- Yegappan

>
>>
>> What I’m trying to do is to start a job that will search in a large
>> code base and to be able to work with the available results as they
>> appear. I don’t want to wait for the entire search to complete. Now,
>> when trying to call setqflist(…, ‘a’) from the job’s callback I can’t
>> really work with the results that already arrived.
>>
>
> Makes sense.
>

-- 
-- 
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/src/quickfix.c b/src/quickfix.c
index 00762bd..706c6ea 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4115,9 +4115,12 @@ set_errorlist(
        qi->qf_lists[qi->qf_curlist].qf_nonevalid = TRUE;
     else
        qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
-    qi->qf_lists[qi->qf_curlist].qf_ptr = 
qi->qf_lists[qi->qf_curlist].qf_start;
-    if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
-       qi->qf_lists[qi->qf_curlist].qf_index = 1;
+    if (action != 'a') {
+       qi->qf_lists[qi->qf_curlist].qf_ptr =
+           qi->qf_lists[qi->qf_curlist].qf_start;
+       if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
+           qi->qf_lists[qi->qf_curlist].qf_index = 1;
+    }
 
 #ifdef FEAT_WINDOWS
     qf_update_buffer(qi);
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index 8da1b6f..d32c4a7 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -697,3 +697,51 @@ func Test_cgetexpr_works()
   " this must not crash Vim
   cgetexpr [$x]
 endfunc
+
+" Tests for the setqflist() and setloclist() functions
+function SetXlistTests(cchar, bnum)
+  if a:cchar == 'c'
+    let Xsetlist = 'setqflist('
+    let Xgetlist = 'getqflist()'
+    let Xnext = 'cnext'
+  else
+    let Xsetlist = 'setloclist(0,'
+    let Xgetlist = 'getloclist(0)'
+    let Xnext = 'lnext'
+  endif
+
+  exe 'call ' . Xsetlist . "[{'bufnr': a:bnum, 'lnum': 1}," .
+             \   "{'bufnr': a:bnum, 'lnum': 2}])"
+  exe 'let l = ' . Xgetlist
+  call assert_equal(2, len(l))
+  call assert_equal(2, l[1].lnum)
+
+  exe Xnext
+  exe 'call ' . Xsetlist . "[{'bufnr': a:bnum, 'lnum': 3}], 'a')"
+  exe 'let l = ' . Xgetlist
+  call assert_equal(3, len(l))
+  exe Xnext
+  call assert_equal(3, line('.'))
+
+  exe 'call ' . Xsetlist . "[{'bufnr': a:bnum, 'lnum': 3}," .
+             \   "{'bufnr': a:bnum, 'lnum': 4}," .
+             \   "{'bufnr': a:bnum, 'lnum': 5}], 'r')"
+  exe 'let l = ' . Xgetlist
+  call assert_equal(3, len(l))
+  call assert_equal(5, l[2].lnum)
+
+  exe 'call ' . Xsetlist . "[])"
+  exe 'let l = ' . Xgetlist
+  call assert_equal(0, len(l))
+endfunction
+
+function Test_setqflist()
+  new Xtestfile | only
+  let bnum = bufnr('%')
+  call setline(1, range(1,5))
+
+  call SetXlistTests('c', bnum)
+  call SetXlistTests('l', bnum)
+
+  call delete('Xtestfile')
+endfunction

Raspunde prin e-mail lui