diff --git a/7.3.636 b/7.3.636 new file mode 100644 index 0000000..453a7fc --- /dev/null +++ b/7.3.636 @@ -0,0 +1,148 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.636 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.636 (after 7.3.625) +Problem: Not all zero-width matches handled correctly for "gn". +Solution: Move zero-width detection to a separate function. (Christian + Brabandt) +Files: src/search.c + + +*** ../vim-7.3.635/src/search.c 2012-08-08 15:27:54.000000000 +0200 +--- src/search.c 2012-08-23 15:52:50.000000000 +0200 +*************** +*** 4526,4531 **** +--- 4526,4533 ---- + #endif /* FEAT_TEXTOBJ */ + + #if defined(FEAT_VISUAL) || defined(PROTO) ++ static int is_zerowidth __ARGS((char_u *pattern)); ++ + /* + * Find next search match under cursor, cursor at end. + * Used while an operator is pending, and in Visual mode. +*************** +*** 4546,4556 **** + int visual_active = FALSE; + int flags = 0; + pos_T save_VIsual; +- regmmatch_T regmatch; +- int nmatched = 0; + int zerowidth = FALSE; + +- + /* wrapping should not occur */ + p_ws = FALSE; + +--- 4548,4555 ---- +*************** +*** 4583,4606 **** + else + orig_pos = pos = start_pos = curwin->w_cursor; + +! /* +! * Check for zero-width pattern. +! */ +! if (search_regcomp(spats[last_idx].pat, RE_SEARCH, RE_SEARCH, +! ((SEARCH_HIS + SEARCH_KEEP)), ®match) == FAIL) + return FAIL; + +- /* Zero-width pattern should match somewhere, then we can check if start +- * and end are in the same position. */ +- nmatched = vim_regexec_multi(®match, curwin, curbuf, +- curwin->w_cursor.lnum, (colnr_T)0, NULL); +- if (called_emsg) +- return FAIL; +- if (nmatched && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum +- && regmatch.endpos[0].col == regmatch.startpos[0].col) +- zerowidth = TRUE; +- vim_free(regmatch.regprog); +- + /* + * The trick is to first search backwards and then search forward again, + * so that a match at the current cursor position will be correctly +--- 4582,4592 ---- + else + orig_pos = pos = start_pos = curwin->w_cursor; + +! /* Is the pattern is zero-width? */ +! zerowidth = is_zerowidth(spats[last_idx].pat); +! if (zerowidth == -1) + return FAIL; + + /* + * The trick is to first search backwards and then search forward again, + * so that a match at the current cursor position will be correctly +*************** +*** 4693,4698 **** +--- 4679,4721 ---- + + return OK; + } ++ ++ /* ++ * Check if the pattern is zero-width. ++ * Returns TRUE, FALSE or -1 for failure. ++ */ ++ static int ++ is_zerowidth(pattern) ++ char_u *pattern; ++ { ++ regmmatch_T regmatch; ++ int nmatched = 0; ++ int result = -1; ++ pos_T pos; ++ ++ if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH, ++ SEARCH_KEEP, ®match) == FAIL) ++ return -1; ++ ++ /* move to match */ ++ clearpos(&pos); ++ if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1, ++ SEARCH_KEEP, RE_SEARCH, 0, NULL) != FAIL) ++ { ++ /* Zero-width pattern should match somewhere, then we can check if ++ * start and end are in the same position. */ ++ 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); ++ } ++ ++ vim_free(regmatch.regprog); ++ return result; ++ } + #endif /* FEAT_VISUAL */ + + #if defined(FEAT_LISP) || defined(FEAT_CINDENT) || defined(FEAT_TEXTOBJ) \ +*** ../vim-7.3.635/src/version.c 2012-08-23 13:28:50.000000000 +0200 +--- src/version.c 2012-08-23 15:25:23.000000000 +0200 +*************** +*** 721,722 **** +--- 721,724 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 636, + /**/ + +-- +Edison's greatest achievement came in 1879, when he invented the +electric company. Edison's design was a brilliant adaptation of the +simple electrical circuit: the electric company sends electricity +through a wire to a customer, then immediately gets the electricity +back through another wire + + /// 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 ///