diff options
| author | James McCoy <jamessan@jamessan.com> | 2017-12-18 07:05:51 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-12-18 07:05:51 -0500 | 
| commit | 6b5d92f9e0e9754933abec06e9265027f388357f (patch) | |
| tree | 000d873abe873ca73656b9ff80963274d634c6eb /src | |
| parent | e6f8b105b00f706ddb8b790a24e37d50711d8dcb (diff) | |
| parent | 853634881335eb9fe4c593710fbb8c71324e1690 (diff) | |
| download | rneovim-6b5d92f9e0e9754933abec06e9265027f388357f.tar.gz rneovim-6b5d92f9e0e9754933abec06e9265027f388357f.tar.bz2 rneovim-6b5d92f9e0e9754933abec06e9265027f388357f.zip  | |
Merge pull request #7740 from jamessan/vim-8.0.0404
[RFC] vim-patch:8.0.0404,8.0.0484
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/quickfix.c | 10 | ||||
| -rw-r--r-- | src/nvim/testdir/test_quickfix.vim | 259 | 
2 files changed, 230 insertions, 39 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 696f123871..6d59d15515 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -4502,6 +4502,9 @@ void ex_helpgrep(exarg_T *eap)      }    } +  // Autocommands may change the list. Save it for later comparison +  qf_info_T *save_qi = qi; +    regmatch.regprog = vim_regcomp(eap->arg, RE_MAGIC + RE_STRING);    regmatch.rm_ic = FALSE;    if (regmatch.regprog != NULL) { @@ -4614,10 +4617,11 @@ void ex_helpgrep(exarg_T *eap)    if (au_name != NULL) {      apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, -        curbuf->b_fname, TRUE, curbuf); -    if (!new_qi && qi != &ql_info && qf_find_buf(qi) == NULL) -      /* autocommands made "qi" invalid */ +                   curbuf->b_fname, true, curbuf); +    if (!new_qi && qi != save_qi && qf_find_buf(qi) == NULL) { +      // autocommands made "qi" invalid        return; +    }    }    /* Jump to first match. */ diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index aff5fc2eed..3d8d18cf88 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -31,7 +31,8 @@ func s:setup_commands(cchar)      command! -nargs=* -bang Xnfile <mods>cnfile<bang> <args>      command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>      command! -nargs=* Xexpr <mods>cexpr <args> -    command! -nargs=* Xvimgrep <mods>vimgrep <args> +    command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args> +    command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args>      command! -nargs=* Xgrep <mods> grep <args>      command! -nargs=* Xgrepadd <mods> grepadd <args>      command! -nargs=* Xhelpgrep helpgrep <args> @@ -61,7 +62,8 @@ func s:setup_commands(cchar)      command! -nargs=* -bang Xnfile <mods>lnfile<bang> <args>      command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>      command! -nargs=* Xexpr <mods>lexpr <args> -    command! -nargs=* Xvimgrep <mods>lvimgrep <args> +    command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args> +    command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args>      command! -nargs=* Xgrep <mods> lgrep <args>      command! -nargs=* Xgrepadd <mods> lgrepadd <args>      command! -nargs=* Xhelpgrep lhelpgrep <args> @@ -85,49 +87,52 @@ func XlistTests(cchar)  		  \ 'non-error 3', 'Xtestfile3:3:1:Line3']    " List only valid entries -  redir => result -  Xlist -  redir END -  let l = split(result, "\n") +  let l = split(execute('Xlist', ''), "\n")    call assert_equal([' 2 Xtestfile1:1 col 3: Line1',  		   \ ' 4 Xtestfile2:2 col 2: Line2',  		   \ ' 6 Xtestfile3:3 col 1: Line3'], l)    " List all the entries -  redir => result -  Xlist! -  redir END -  let l = split(result, "\n") +  let l = split(execute('Xlist!', ''), "\n")    call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',  		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',  		   \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)    " List a range of errors -  redir => result -  Xlist 3,6 -  redir END -  let l = split(result, "\n") +  let l = split(execute('Xlist 3,6', ''), "\n")    call assert_equal([' 4 Xtestfile2:2 col 2: Line2',  		   \ ' 6 Xtestfile3:3 col 1: Line3'], l) -  redir => result -  Xlist! 3,4 -  redir END -  let l = split(result, "\n") +  let l = split(execute('Xlist! 3,4', ''), "\n")    call assert_equal([' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) -  redir => result -  Xlist -6,-4 -  redir END -  let l = split(result, "\n") +  let l = split(execute('Xlist -6,-4', ''), "\n")    call assert_equal([' 2 Xtestfile1:1 col 3: Line1'], l) -  redir => result -  Xlist! -5,-3 -  redir END -  let l = split(result, "\n") +  let l = split(execute('Xlist! -5,-3', ''), "\n")    call assert_equal([' 2 Xtestfile1:1 col 3: Line1',  		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) + +  " Test for '+' +  let l = split(execute('Xlist! +2', ''), "\n") +  call assert_equal([' 2 Xtestfile1:1 col 3: Line1', +		   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) + +  " Different types of errors +  call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11}, +	      \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22}, +	      \ {'lnum':30,'col':15,'type':'i','text':'Info','nr':33}, +	      \ {'lnum':40,'col':20,'type':'x', 'text':'Other','nr':44}, +	      \ {'lnum':50,'col':25,'type':"\<C-A>",'text':'one','nr':55}]) +  let l = split(execute('Xlist', ""), "\n") +  call assert_equal([' 1:10 col 5 warning  11: Warning', +	      \ ' 2:20 col 10 error  22: Error', +	      \ ' 3:30 col 15 info  33: Info', +	      \ ' 4:40 col 20 x  44: Other', +	      \ ' 5:50 col 25  55: one'], l) + +  " Error cases +  call assert_fails('Xlist abc', 'E488:')  endfunc  func Test_clist() @@ -316,6 +321,23 @@ func XbufferTests(cchar)  	\ l[3].lnum == 750 && l[3].col == 25 && l[3].text ==# 'Line 750')    enew! +  " Check for invalid buffer +  call assert_fails('Xbuffer 199', 'E474:') + +  " Check for unloaded buffer +  edit Xtestfile1 +  let bnr = bufnr('%') +  enew! +  call assert_fails('Xbuffer ' . bnr, 'E681:') + +  " Check for invalid range +  " Using Xbuffer will not run the range check in the cbuffer/lbuffer +  " commands. So directly call the commands. +  if (a:cchar == 'c') +      call assert_fails('900,999cbuffer', 'E16:') +  else +      call assert_fails('900,999lbuffer', 'E16:') +  endif  endfunc  func Test_cbuffer() @@ -364,6 +386,9 @@ func Xtest_browse(cchar)    call assert_equal('Xqftestfile1', bufname('%'))    call assert_equal(5, line('.')) +  Xexpr "" +  call assert_fails('Xnext', 'E42:') +    call delete('Xqftestfile1')    call delete('Xqftestfile2')  endfunc @@ -385,6 +410,9 @@ func s:test_xhelpgrep(cchar)    call assert_true(w:quickfix_title =~ title_text, w:quickfix_title)    " This wipes out the buffer, make sure that doesn't cause trouble.    Xclose + +  " Search for non existing help string +  call assert_fails('Xhelpgrep a1b2c3', 'E480:')  endfunc  func Test_helpgrep() @@ -578,7 +606,7 @@ func Test_locationlist()      wincmd n | only      augroup! testgroup -  endfunc +endfunc  func Test_locationlist_curwin_was_closed()      augroup testgroup @@ -597,7 +625,7 @@ func Test_locationlist_curwin_was_closed()      call assert_fails('lrewind', 'E924:')      augroup! testgroup -  endfunc +endfunc  func Test_locationlist_cross_tab_jump()    call writefile(['loclistfoo'], 'loclistfoo') @@ -734,7 +762,7 @@ func Test_efm1()      call delete('Xerrorfile1')      call delete('Xerrorfile2')      call delete('Xtestfile') -  endfunc +endfunc  " Test for quickfix directory stack support  func s:dir_stack_tests(cchar) @@ -893,30 +921,44 @@ func Test_efm2()    call assert_equal(l[0].pattern, '^\VLine search text\$')    call assert_equal(l[0].lnum, 0) +  let l = split(execute('clist', ''), "\n") +  call assert_equal([' 1 Xtestfile:^\VLine search text\$:  '], l) +    " Test for %P, %Q and %t format specifiers    let lines=["[Xtestfile1]",  	      \ "(1,17)  error: ';' missing",  	      \ "(21,2)  warning: variable 'z' not defined",  	      \ "(67,3)  error: end of file found before string ended", +	      \ "--",  	      \ "",  	      \ "[Xtestfile2]", +	      \ "--",  	      \ "",  	      \ "[Xtestfile3]",  	      \ "NEW compiler v1.1",  	      \ "(2,2)   warning: variable 'x' not defined", -	      \ "(67,3)  warning: 's' already defined" +	      \ "(67,3)  warning: 's' already defined", +	      \ "--"  	      \] -  set efm=%+P[%f],(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%-Q +  set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r +  " To exercise the push/pop file functionality in quickfix, the test files +  " need to be created. +  call writefile(['Line1'], 'Xtestfile1') +  call writefile(['Line2'], 'Xtestfile2') +  call writefile(['Line3'], 'Xtestfile3')    cexpr ""    for l in lines        caddexpr l    endfor    let l = getqflist() -  call assert_equal(9, len(l)) +  call assert_equal(12, len(l))    call assert_equal(21, l[2].lnum)    call assert_equal(2, l[2].col)    call assert_equal('w', l[2].type)    call assert_equal('e', l[3].type) +  call delete('Xtestfile1') +  call delete('Xtestfile2') +  call delete('Xtestfile3')    " Tests for %E, %C and %Z format specifiers    let lines = ["Error 275", @@ -1064,6 +1106,13 @@ func SetXlistTests(cchar, bnum)    call g:Xsetlist([])    let l = g:Xgetlist()    call assert_equal(0, len(l)) + +  " Error cases: +  " Refer to a non-existing buffer and pass a non-dictionary type +  call assert_fails("call g:Xsetlist([{'bufnr':998, 'lnum':4}," . +	      \ " {'bufnr':999, 'lnum':5}])", 'E92:') +  call g:Xsetlist([[1, 2,3]]) +  call assert_equal(0, len(g:Xgetlist()))  endfunc  func Test_setqflist() @@ -1082,7 +1131,8 @@ func Xlist_empty_middle(cchar)    call s:setup_commands(a:cchar)    " create three quickfix lists -  Xvimgrep Test_ test_quickfix.vim +  let @/ = 'Test_' +  Xvimgrep // test_quickfix.vim    let testlen = len(g:Xgetlist())    call assert_true(testlen > 0)    Xvimgrep empty test_quickfix.vim @@ -1351,11 +1401,25 @@ func Test_switchbuf()    call assert_equal(2, winnr('$'))    call assert_equal(1, bufwinnr('Xqftestfile3')) +  " If only quickfix window is open in the current tabpage, jumping to an +  " entry with 'switchubf' set to 'usetab' should search in other tabpages.    enew | only +  set switchbuf=usetab +  tabedit Xqftestfile1 +  tabedit Xqftestfile2 +  tabedit Xqftestfile3 +  tabfirst +  copen | only +  clast +  call assert_equal(4, tabpagenr()) +  tabfirst | tabonly | enew | only    call delete('Xqftestfile1')    call delete('Xqftestfile2')    call delete('Xqftestfile3') +  set switchbuf&vim + +  enew | only  endfunc  func Xadjust_qflnum(cchar) @@ -1561,6 +1625,22 @@ func Xproperty_tests(cchar)      call g:Xsetlist([], ' ', {'title' : 'N3'})      call assert_equal('N2', g:Xgetlist({'nr':2, 'title':1}).title) +    " Changing the title of an earlier quickfix list +    call g:Xsetlist([], ' ', {'title' : 'NewTitle', 'nr' : 2}) +    call assert_equal('NewTitle', g:Xgetlist({'nr':2, 'title':1}).title) + +    " Changing the title of an invalid quickfix list +    call assert_equal(-1, g:Xsetlist([], ' ', +		\ {'title' : 'SomeTitle', 'nr' : 99})) +    call assert_equal(-1, g:Xsetlist([], ' ', +		\ {'title' : 'SomeTitle', 'nr' : 'abc'})) + +    if a:cchar == 'c' +	copen +	call assert_equal({'winid':win_getid()}, getqflist({'winid':1})) +	cclose +    endif +      " Invalid arguments      call assert_fails('call g:Xgetlist([])', 'E715')      call assert_fails('call g:Xsetlist([], "a", [])', 'E715') @@ -1568,16 +1648,18 @@ func Xproperty_tests(cchar)      call assert_equal(-1, s)      call assert_equal({}, g:Xgetlist({'abc':1})) +    call assert_equal({}, g:Xgetlist({'nr':99, 'title':1})) +    call assert_equal({}, g:Xgetlist({'nr':[], 'title':1}))      if a:cchar == 'l' -        call assert_equal({}, getloclist(99, {'title': 1})) +	call assert_equal({}, getloclist(99, {'title': 1}))      endif -  endfunc +endfunc  func Test_qf_property()      call Xproperty_tests('c')      call Xproperty_tests('l') -  endfunc +endfunc  " Tests for the QuickFixCmdPre/QuickFixCmdPost autocommands  func QfAutoCmdHandler(loc, cmd) @@ -1673,3 +1755,108 @@ func Test_dirstack_cleanup()    caddbuffer    let &efm = save_efm  endfunc + +" Tests for jumping to entries from the location list window and quickfix +" window +func Test_cwindow_jump() +  set efm=%f%%%l%%%m +  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] +  lopen | only +  lfirst +  call assert_true(winnr('$') == 2) +  call assert_true(winnr() == 1) +  " Location list for the new window should be set +  call assert_true(getloclist(0)[2].text == 'Line 30') + +  " Open a scratch buffer +  " Open a new window and create a location list +  " Open the location list window and close the other window +  " Jump to an entry. +  " Should create a new window and jump to the entry. The scrtach buffer +  " should not be used. +  enew | only +  set buftype=nofile +  below new +  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] +  lopen +  2wincmd c +  lnext +  call assert_true(winnr('$') == 3) +  call assert_true(winnr() == 2) + +  " Open two windows with two different location lists +  " Open the location list window and close the previous window +  " Jump to an entry in the location list window +  " Should open the file in the first window and not set the location list. +  enew | only +  lgetexpr ["F1%5%Line 5"] +  below new +  lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] +  lopen +  2wincmd c +  lnext +  call assert_true(winnr() == 1) +  call assert_true(getloclist(0)[0].text == 'Line 5') + +  enew | only +  cgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"] +  copen +  cnext +  call assert_true(winnr('$') == 2) +  call assert_true(winnr() == 1) + +  enew | only +  set efm&vim +endfunc + +func XvimgrepTests(cchar) +  call s:setup_commands(a:cchar) + +  call writefile(['Editor:VIM vim', +	      \ 'Editor:Emacs EmAcS', +	      \ 'Editor:Notepad NOTEPAD'], 'Xtestfile1') +  call writefile(['Linux', 'MacOS', 'MS-Windows'], 'Xtestfile2') + +  " Error cases +  call assert_fails('Xvimgrep /abc *', 'E682:') + +  let @/='' +  call assert_fails('Xvimgrep // *', 'E35:') + +  call assert_fails('Xvimgrep abc', 'E683:') +  call assert_fails('Xvimgrep a1b2c3 Xtestfile1', 'E480:') +  call assert_fails('Xvimgrep pat Xa1b2c3', 'E480:') + +  Xexpr "" +  Xvimgrepadd Notepad Xtestfile1 +  Xvimgrepadd MacOS Xtestfile2 +  let l = g:Xgetlist() +  call assert_equal(2, len(l)) +  call assert_equal('Editor:Notepad NOTEPAD', l[0].text) + +  Xvimgrep #\cvim#g Xtestfile? +  let l = g:Xgetlist() +  call assert_equal(2, len(l)) +  call assert_equal(8, l[0].col) +  call assert_equal(12, l[1].col) + +  1Xvimgrep ?Editor? Xtestfile* +  let l = g:Xgetlist() +  call assert_equal(1, len(l)) +  call assert_equal('Editor:VIM vim', l[0].text) + +  edit +3 Xtestfile2 +  Xvimgrep +\cemacs+j Xtestfile1 +  let l = g:Xgetlist() +  call assert_equal('Xtestfile2', bufname('')) +  call assert_equal('Editor:Emacs EmAcS', l[0].text) + +  call delete('Xtestfile1') +  call delete('Xtestfile2') +endfunc + +" Tests for the :vimgrep command +func Test_vimgrep() +  call XvimgrepTests('c') +  call XvimgrepTests('l') +endfunc  | 
