diff options
| -rw-r--r-- | runtime/doc/eval.txt | 3 | ||||
| -rw-r--r-- | src/nvim/quickfix.c | 12 | ||||
| -rw-r--r-- | src/nvim/testdir/test_quickfix.vim | 96 | 
3 files changed, 96 insertions, 15 deletions
| diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index efc8775d0a..0b50340dee 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -6841,6 +6841,7 @@ setqflist({list} [, {action}[, {what}]])		*setqflist()*  		    nr		error number  		    text	description of the error  		    type	single-character error type, 'E', 'W', etc. +		    valid	recognized error message  		The "col", "vcol", "nr", "type" and "text" entries are  		optional.  Either "lnum" or "pattern" entry can be used to @@ -6850,6 +6851,8 @@ setqflist({list} [, {action}[, {what}]])		*setqflist()*  		item will not be handled as an error line.  		If both "pattern" and "lnum" are present then "pattern" will  		be used. +		If the "valid" entry is not supplied, then the valid flag is +		set when "bufnr" is a valid buffer or "filename" exists.  		If you supply an empty {list}, the quickfix list will be  		cleared.  		Note that the list is not exactly the same as what diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 73ad14ab22..d77cec4fd8 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -2411,11 +2411,18 @@ static void qf_free(qf_info_T *qi, int idx)    qi->qf_lists[idx].qf_ptr = NULL;    qi->qf_lists[idx].qf_title = NULL;    qi->qf_lists[idx].qf_index = 0; +  qi->qf_lists[idx].qf_start = NULL; +  qi->qf_lists[idx].qf_last = NULL; +  qi->qf_lists[idx].qf_ptr = NULL; +  qi->qf_lists[idx].qf_nonevalid = true;    qf_clean_dir_stack(&qi->qf_dir_stack);    qi->qf_directory = NULL;    qf_clean_dir_stack(&qi->qf_file_stack);    qi->qf_currfile = NULL; +  qi->qf_multiline = false; +  qi->qf_multiignore = false; +  qi->qf_multiscan = false;  }  /* @@ -4182,6 +4189,11 @@ static int qf_add_entries(qf_info_T *qi, list_T *list, char_u *title,        bufnum = 0;      } +    // If the 'valid' field is present it overrules the detected value. +    if (tv_dict_find(d, "valid", -1) != NULL) { +      valid = (int)tv_dict_get_number(d, "valid"); +    } +      int status = qf_add_entry(qi,                                NULL,      // dir                                (char_u *)filename, diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index 40ad387dee..dd64e37ce3 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -24,8 +24,8 @@ func s:setup_commands(cchar)      command! -nargs=* Xgetbuffer <mods>cgetbuffer <args>      command! -nargs=* Xaddbuffer <mods>caddbuffer <args>      command! -nargs=* Xrewind <mods>crewind <args> -    command! -nargs=* -bang Xnext <mods>cnext<bang> <args> -    command! -nargs=* -bang Xprev <mods>cprev<bang> <args> +    command! -count -nargs=* -bang Xnext <mods><count>cnext<bang> <args> +    command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>      command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>      command! -nargs=* -bang Xlast <mods>clast<bang> <args>      command! -nargs=* -bang Xnfile <mods>cnfile<bang> <args> @@ -56,8 +56,8 @@ func s:setup_commands(cchar)      command! -nargs=* Xgetbuffer <mods>lgetbuffer <args>      command! -nargs=* Xaddbuffer <mods>laddbuffer <args>      command! -nargs=* Xrewind <mods>lrewind <args> -    command! -nargs=* -bang Xnext <mods>lnext<bang> <args> -    command! -nargs=* -bang Xprev <mods>lprev<bang> <args> +    command! -count -nargs=* -bang Xnext <mods><count>lnext<bang> <args> +    command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>      command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>      command! -nargs=* -bang Xlast <mods>llast<bang> <args>      command! -nargs=* -bang Xnfile <mods>lnfile<bang> <args> @@ -395,7 +395,9 @@ func Xtest_browse(cchar)    Xgetexpr ['Xqftestfile1:5:Line5',  		\ 'Xqftestfile1:6:Line6',  		\ 'Xqftestfile2:10:Line10', -		\ 'Xqftestfile2:11:Line11'] +		\ 'Xqftestfile2:11:Line11', +		\ 'RegularLine1', +		\ 'RegularLine2']    Xfirst    call assert_fails('Xprev', 'E553') @@ -407,6 +409,7 @@ func Xtest_browse(cchar)    call assert_equal('Xqftestfile1', bufname('%'))    call assert_equal(6, line('.'))    Xlast +  Xprev    call assert_equal('Xqftestfile2', bufname('%'))    call assert_equal(11, line('.'))    call assert_fails('Xnext', 'E553') @@ -415,6 +418,13 @@ func Xtest_browse(cchar)    call assert_equal('Xqftestfile1', bufname('%'))    call assert_equal(5, line('.')) +  10Xnext +  call assert_equal('Xqftestfile2', bufname('%')) +  call assert_equal(11, line('.')) +  10Xprev +  call assert_equal('Xqftestfile1', bufname('%')) +  call assert_equal(5, line('.')) +    Xexpr ""    call assert_fails('Xnext', 'E42:') @@ -437,9 +447,30 @@ func s:test_xhelpgrep(cchar)      let title_text = ':lhelpgrep quickfix'    endif    call assert_true(w:quickfix_title =~ title_text, w:quickfix_title) + +  " Jumping to a help topic should open the help window +  only +  Xnext +  call assert_true(&buftype == 'help') +  call assert_true(winnr('$') == 2) +  " Jumping to the next match should reuse the help window +  Xnext +  call assert_true(&buftype == 'help') +  call assert_true(winnr() == 1) +  call assert_true(winnr('$') == 2) +  " Jumping to the next match from the quickfix window should reuse the help +  " window +  Xopen +  Xnext +  call assert_true(&buftype == 'help') +  call assert_true(winnr() == 1) +  call assert_true(winnr('$') == 2) +    " This wipes out the buffer, make sure that doesn't cause trouble.    Xclose +  new | only +    " Search for non existing help string    call assert_fails('Xhelpgrep a1b2c3', 'E480:')  endfunc @@ -578,10 +609,7 @@ func Test_locationlist()      lrewind      enew      lopen -    lnext -    lnext -    lnext -    lnext +    4lnext      vert split      wincmd L      lopen @@ -1039,6 +1067,25 @@ func Test_efm2()    call assert_equal(1, l[4].valid)    call assert_equal('unittests/dbfacadeTest.py', bufname(l[4].bufnr)) +  " The following sequence of commands used to crash Vim +  set efm=%W%m +  cgetexpr ['msg1'] +  let l = getqflist() +  call assert_equal(1, len(l), string(l)) +  call assert_equal('msg1', l[0].text) +  set efm=%C%m +  lexpr 'msg2' +  let l = getloclist(0) +  call assert_equal(1, len(l), string(l)) +  call assert_equal('msg2', l[0].text) +  lopen +  call setqflist([], 'r') +  caddbuf +  let l = getqflist() +  call assert_equal(1, len(l), string(l)) +  call assert_equal('|| msg2', l[0].text) + +  new | only    let &efm = save_efm  endfunc @@ -1136,6 +1183,25 @@ func SetXlistTests(cchar, bnum)    let l = g:Xgetlist()    call assert_equal(0, len(l)) +  " Tests for setting the 'valid' flag +  call g:Xsetlist([{'bufnr':a:bnum, 'lnum':4, 'valid':0}]) +  Xwindow +  call assert_equal(1, winnr('$')) +  let l = g:Xgetlist() +  call g:Xsetlist(l) +  call assert_equal(0, g:Xgetlist()[0].valid) +  call g:Xsetlist([{'text':'Text1', 'valid':1}]) +  Xwindow +  call assert_equal(2, winnr('$')) +  Xclose +  let save_efm = &efm +  set efm=%m +  Xgetexpr 'TestMessage' +  let l = g:Xgetlist() +  call g:Xsetlist(l) +  call assert_equal(1, g:Xgetlist()[0].valid) +  let &efm = save_efm +    " Error cases:    " Refer to a non-existing buffer and pass a non-dictionary type    call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," . @@ -1369,18 +1435,18 @@ func Test_switchbuf()    let winid = win_getid()    cfirst | cnext    call assert_equal(winid, win_getid()) -  cnext | cnext +  2cnext    call assert_equal(winid, win_getid()) -  cnext | cnext +  2cnext    call assert_equal(winid, win_getid())    enew    set switchbuf=useopen    cfirst | cnext    call assert_equal(file1_winid, win_getid()) -  cnext | cnext +  2cnext    call assert_equal(file2_winid, win_getid()) -  cnext | cnext +  2cnext    call assert_equal(file2_winid, win_getid())    enew | only @@ -1390,9 +1456,9 @@ func Test_switchbuf()    tabfirst    cfirst | cnext    call assert_equal(2, tabpagenr()) -  cnext | cnext +  2cnext    call assert_equal(3, tabpagenr()) -  cnext | cnext +  2cnext    call assert_equal(3, tabpagenr())    tabfirst | tabonly | enew | 
