diff options
Diffstat (limited to 'src/nvim/search.c')
-rw-r--r-- | src/nvim/search.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/nvim/search.c b/src/nvim/search.c index 1029190db4..8cfac8c362 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -3977,7 +3977,7 @@ current_search ( } /* - * Check if the pattern is one character or zero-width. + * 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. @@ -3991,10 +3991,16 @@ static int is_one_char(char_u *pattern, bool move) 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); @@ -4003,21 +4009,29 @@ static int is_one_char(char_u *pattern, bool move) /* accept a match at the cursor position */ flag = SEARCH_START; } - if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1, + 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; - nmatched = vim_regexec_multi(®match, curwin, curbuf, - pos.lnum, (colnr_T)0, NULL); + 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) + 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; + // one char width + if (!result && inc(&pos) >= 0 && pos.col == regmatch.endpos[0].col) { + result = true; + } + } } called_emsg |= save_called_emsg; |