To: vim_dev@googlegroups.com Subject: Patch 7.4.2100 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2100 Problem: "cgn" and "dgn" do not work correctly with a single character match and the replacement includes the searched pattern. (John Beckett) Solution: If the match is found in the wrong column try in the next column. Turn the test into new style. (Christian Brabandt) Files: src/search.c, src/testdir/Make_all.mak, src/Makefile, src/testdir/test53.in, src/testdir/test53.ok, src/testdir/test_gn.vim *** ../vim-7.4.2099/src/search.c 2016-04-21 09:06:54.479485966 +0200 --- src/search.c 2016-07-24 17:21:02.648247925 +0200 *************** *** 4719,4725 **** } /* ! * Check if the pattern is one character or zero-width. * If move is TRUE, check from the beginning of the buffer, else from the * current cursor position. * Returns TRUE, FALSE or -1 for failure. --- 4719,4725 ---- } /* ! * Check if the pattern is one character long or zero-width. * If move is TRUE, check from the beginning of the buffer, else from the * current cursor position. * Returns TRUE, FALSE or -1 for failure. *************** *** 4734,4743 **** --- 4734,4748 ---- int save_called_emsg = called_emsg; int flag = 0; + if (pattern == NULL) + pattern = spats[last_idx].pat; + if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH, SEARCH_KEEP, ®match) == FAIL) return -1; + /* init startcol correctly */ + regmatch.startpos[0].col = -1; /* move to match */ if (move) clearpos(&pos) *************** *** 4748,4769 **** flag = SEARCH_START; } ! if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1, SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL) { /* Zero-width pattern should match somewhere, then we can check if * start and end are in the same position. */ called_emsg = FALSE; ! nmatched = vim_regexec_multi(®match, curwin, curbuf, ! pos.lnum, (colnr_T)0, NULL); if (!called_emsg) result = (nmatched != 0 && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum && regmatch.startpos[0].col == regmatch.endpos[0].col); ! ! if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col) ! result = TRUE; } called_emsg |= save_called_emsg; --- 4753,4782 ---- flag = SEARCH_START; } ! if (searchit(curwin, curbuf, &pos, FORWARD, pattern, 1, SEARCH_KEEP + flag, RE_SEARCH, 0, NULL) != FAIL) { /* Zero-width pattern should match somewhere, then we can check if * start and end are in the same position. */ called_emsg = FALSE; ! do ! { ! regmatch.startpos[0].col++; ! nmatched = vim_regexec_multi(®match, curwin, curbuf, ! pos.lnum, regmatch.startpos[0].col, NULL); ! if (!nmatched) ! break; ! } while (regmatch.startpos[0].col < pos.col); if (!called_emsg) + { result = (nmatched != 0 && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum && regmatch.startpos[0].col == regmatch.endpos[0].col); ! /* one char width */ ! if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col) ! result = TRUE; ! } } called_emsg |= save_called_emsg; *** ../vim-7.4.2099/src/testdir/Make_all.mak 2016-07-23 22:04:30.000702667 +0200 --- src/testdir/Make_all.mak 2016-07-24 17:21:44.943839497 +0200 *************** *** 171,176 **** --- 171,177 ---- test_cscope.res \ test_digraph.res \ test_farsi.res \ + test_gn.res \ test_hardcopy.res \ test_history.res \ test_increment.res \ *** ../vim-7.4.2099/src/Makefile 2016-07-23 22:04:30.004702632 +0200 --- src/Makefile 2016-07-24 17:25:07.969880015 +0200 *************** *** 2076,2081 **** --- 2076,2082 ---- test_filter_map \ test_fnamemodify \ test_glob2regpat \ + test_gn \ test_goto \ test_hardcopy \ test_help_tagjump \ *** ../vim-7.4.2099/src/testdir/test53.in 2015-03-05 19:57:45.322721298 +0100 --- src/testdir/test53.in 2016-07-24 17:21:02.648247925 +0200 *************** *** 4,11 **** Also test match() and matchstr() - Also test the gn command and repeating it. - STARTTEST :so small.vim /^start:/ --- 4,9 ---- *************** *** 53,87 **** :put =match('abc', '\zs', 2, 1) " 2 :put =match('abc', '\zs', 3, 1) " 3 :put =match('abc', '\zs', 4, 1) " -1 - /^foobar - gncsearchmatch/one\_s*two\_s - :1 - gnd - /[a]bcdx - :1 - 2gnd/join - /$ - 0gnd - /\>\zs - 0gnd/^ - gnd$h/\zs - gnd/[u]niquepattern/s - vlgnd - /mother - :set selection=exclusive - $cgNmongoose/i - cgnj - :" Make sure there is no other match y uppercase. - /x59 - gggnd - :" test repeating dgn - /^Johnny - ggdgn. - :" test repeating gUgn - /^Depp - gggUgn. - gg/a:0\@!\zs\d\+ - nygnop :/^start:/,/^end:/wq! test.out ENDTEST --- 51,56 ---- *************** *** 103,134 **** SEARCH: - foobar - one - two - abcdx | abcdx | abcdx - join - lines - zero width pattern - delete first and last chars - uniquepattern uniquepattern - my very excellent mother just served us nachos - for (i=0; i<=10; i++) - a:10 - - a:1 - - a:20 - Y - text - Y - --1 - Johnny - --2 - Johnny - --3 - Depp - --4 - Depp - --5 end: --- 72,75 ---- *** ../vim-7.4.2099/src/testdir/test53.ok 2015-03-05 19:57:45.322721298 +0100 --- src/testdir/test53.ok 2016-07-24 17:21:02.648247925 +0200 *************** *** 42,71 **** 3 -1 SEARCH: - searchmatch - abcdx | | abcdx - join lines - zerowidth pattern - elete first and last char - uniquepattern - my very excellent mongoose just served us nachos - for (j=0; i<=10; i++) - a:10 - - a:1 - 1 - - a:20 - - text - Y - --1 - - --2 - - --3 - DEPP - --4 - DEPP - --5 end: --- 42,45 ---- *** ../vim-7.4.2099/src/testdir/test_gn.vim 2016-07-24 17:31:13.518356108 +0200 --- src/testdir/test_gn.vim 2016-07-24 17:21:02.648247925 +0200 *************** *** 0 **** --- 1,93 ---- + " Test for gn command + + func Test_gn_command() + noa new + " replace a single char by itsself quoted: + call setline('.', 'abc x def x ghi x jkl') + let @/='x' + exe "norm! cgn'x'\.." + call assert_equal("abc 'x' def 'x' ghi 'x' jkl", getline('.')) + sil! %d_ + " simple search match + call setline('.', 'foobar') + let @/='foobar' + exe "norm! gncsearchmatch" + call assert_equal('searchmatch', getline('.')) + sil! %d _ + " replace a multi-line match + call setline('.', ['', 'one', 'two']) + let @/='one\_s*two\_s' + exe "norm! gnceins\zwei" + call assert_equal(['','eins','zwei'], getline(1,'$')) + sil! %d _ + " test count argument + call setline('.', ['', 'abcdx | abcdx | abcdx']) + let @/='[a]bcdx' + exe "norm! 2gnd" + call assert_equal(['','abcdx | | abcdx'], getline(1,'$')) + sil! %d _ + " join lines + call setline('.', ['join ', 'lines']) + let @/='$' + exe "norm! 0gnd" + call assert_equal(['join lines'], getline(1,'$')) + sil! %d _ + " zero-width match + call setline('.', ['', 'zero width pattern']) + let @/='\>\zs' + exe "norm! 0gnd" + call assert_equal(['', 'zerowidth pattern'], getline(1,'$')) + sil! %d _ + " delete first and last chars + call setline('.', ['delete first and last chars']) + let @/='^' + exe "norm! 0gnd$" + let @/='\zs' + exe "norm! gnd" + call assert_equal(['elete first and last char'], getline(1,'$')) + sil! %d _ + " using visual mode + call setline('.', ['', 'uniquepattern uniquepattern']) + exe "norm! /[u]niquepattern/s\vlgnd" + call assert_equal(['', ' uniquepattern'], getline(1,'$')) + sil! %d _ + " backwards search + call setline('.', ['my very excellent mother just served us nachos']) + let @/='mother' + exe "norm! $cgNmongoose" + call assert_equal(['my very excellent mongoose just served us nachos'], getline(1,'$')) + sil! %d _ + " search for single char + call setline('.', ['','for (i=0; i<=10; i++)']) + let @/='i' + exe "norm! cgnj" + call assert_equal(['','for (j=0; i<=10; i++)'], getline(1,'$')) + sil! %d _ + " search hex char + call setline('.', ['','Y']) + set noignorecase + let @/='\%x59' + exe "norm! gnd" + call assert_equal(['',''], getline(1,'$')) + sil! %d _ + " test repeating gdn + call setline('.', ['', '1', 'Johnny', '2', 'Johnny', '3']) + let @/='Johnny' + exe "norm! dgn." + call assert_equal(['','1', '', '2', '', '3'], getline(1,'$')) + sil! %d _ + " test repeating gUgn + call setline('.', ['', '1', 'Depp', '2', 'Depp', '3']) + let @/='Depp' + exe "norm! gUgn." + call assert_equal(['', '1', 'DEPP', '2', 'DEPP', '3'], getline(1,'$')) + sil! %d _ + " test using look-ahead assertions + call setline('.', ['a:10', '', 'a:1', '', 'a:20']) + let @/='a:0\@!\zs\d\+' + exe "norm! 2nygno\p" + call assert_equal(['a:10', '', 'a:1', '1', '', 'a:20'], getline(1,'$')) + sil! %d _ + endfu + + " vim: tabstop=2 shiftwidth=0 expandtab *** ../vim-7.4.2099/src/version.c 2016-07-24 16:17:55.753759205 +0200 --- src/version.c 2016-07-24 17:25:22.577739093 +0200 *************** *** 760,761 **** --- 760,763 ---- { /* Add new patch number below this line */ + /**/ + 2100, /**/ -- TIM: But follow only if you are men of valour. For the entrance to this cave is guarded by a monster, a creature so foul and cruel that no man yet has fought with it and lived. Bones of full fifty men lie strewn about its lair ... "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///