| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.625 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.625 |
| Problem: "gn" does not handle zero-width matches correctly. |
| Solution: Handle zero-width patterns specially. (Christian Brabandt) |
| Files: src/search.c |
| |
| |
| |
| |
| |
| *** 4546,4551 **** |
| --- 4546,4554 ---- |
| int visual_active = FALSE; |
| int flags = 0; |
| pos_T save_VIsual; |
| + regmmatch_T regmatch; |
| + int nmatched = 0; |
| + int zerowidth = FALSE; |
| |
| |
| /* wrapping should not occur */ |
| |
| *** 4581,4603 **** |
| orig_pos = pos = start_pos = curwin->w_cursor; |
| |
| /* |
| * The trick is to first search backwards and then search forward again, |
| * so that a match at the current cursor position will be correctly |
| * captured. |
| */ |
| for (i = 0; i < 2; i++) |
| { |
| - if (i && count == 1) |
| - flags = SEARCH_START; |
| - |
| if (forward) |
| dir = i; |
| else |
| dir = !i; |
| result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD), |
| spats[last_idx].pat, (long) (i ? count : 1), |
| ! SEARCH_KEEP | flags | (dir ? 0 : SEARCH_END), |
| ! RE_SEARCH, 0, NULL); |
| |
| /* First search may fail, but then start searching from the |
| * beginning of the file (cursor might be on the search match) |
| --- 4584,4625 ---- |
| 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 |
| * captured. |
| */ |
| for (i = 0; i < 2; i++) |
| { |
| if (forward) |
| dir = i; |
| else |
| dir = !i; |
| + |
| + flags = 0; |
| + if (!dir && !zerowidth) |
| + flags = SEARCH_END; |
| + |
| result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD), |
| spats[last_idx].pat, (long) (i ? count : 1), |
| ! SEARCH_KEEP | flags, RE_SEARCH, 0, NULL); |
| |
| /* First search may fail, but then start searching from the |
| * beginning of the file (cursor might be on the search match) |
| |
| *** 4629,4638 **** |
| } |
| |
| start_pos = pos; |
| ! flags = (forward ? SEARCH_END : 0); |
| |
| ! /* move to match */ |
| ! result = searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD), |
| spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0, NULL); |
| |
| if (!VIsual_active) |
| --- 4651,4662 ---- |
| } |
| |
| start_pos = pos; |
| ! flags = forward ? SEARCH_END : 0; |
| |
| ! /* move to match, except for zero-width matches, in which case, we are |
| ! * already on the next match */ |
| ! if (!zerowidth) |
| ! result = searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD), |
| spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0, NULL); |
| |
| if (!VIsual_active) |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 625, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 222. You send more than 20 personal e-mails a day. |
| |
| /// 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 /// |