diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/search.c | 22 | ||||
| -rw-r--r-- | src/nvim/testdir/test53.in | 7 | ||||
| -rw-r--r-- | src/nvim/testdir/test53.ok | 6 | ||||
| -rw-r--r-- | src/nvim/version.c | 2 | 
4 files changed, 31 insertions, 6 deletions
| diff --git a/src/nvim/search.c b/src/nvim/search.c index 5158e6cd86..d3946a9b63 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -3757,7 +3757,6 @@ current_quote (  /*   * Find next search match under cursor, cursor at end.   * Used while an operator is pending, and in Visual mode. - * TODO: redo only works when used in operator pending mode   */  int   current_search ( @@ -3792,7 +3791,7 @@ current_search (      orig_pos = pos = curwin->w_cursor;    /* Is the pattern is zero-width? */ -  int one_char = is_one_char(spats[last_idx].pat); +  int one_char = is_one_char(spats[last_idx].pat, true);    if (one_char == -1) {      p_ws = old_p_ws;      return FAIL;      /* pattern not found */ @@ -3840,6 +3839,10 @@ current_search (    int flags = forward ? SEARCH_END : 0;    pos_T start_pos = pos; +  /* Check again from the current cursor position, +   * since the next match might actually be only one char wide */ +  one_char = is_one_char(spats[last_idx].pat, false); +    /* move to match, except for zero-width matches, in which case, we are     * already on the next match */    if (!one_char) @@ -3878,24 +3881,33 @@ current_search (  /*   * 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.   */ -static int is_one_char(char_u *pattern) +static int is_one_char(char_u *pattern, bool move)  {    regmmatch_T regmatch;    int nmatched = 0;    int result = -1;    pos_T pos;    int save_called_emsg = called_emsg; +  int flag = 0;    if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH,            SEARCH_KEEP, ®match) == FAIL)      return -1;    /* move to match */ -  clearpos(&pos); +  if (move) { +    clearpos(&pos); +  } else { +    pos = curwin->w_cursor; +    /* accept a match at the cursor position */ +    flag = SEARCH_START; +  }    if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1, -          SEARCH_KEEP, RE_SEARCH, 0, NULL) != FAIL) { +          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; diff --git a/src/nvim/testdir/test53.in b/src/nvim/testdir/test53.in index 011c9ae39d..8ca9c9ed29 100644 --- a/src/nvim/testdir/test53.in +++ b/src/nvim/testdir/test53.in @@ -79,6 +79,8 @@ ggdgn.  :" test repeating gUgn  /^Depp  gggUgn. +gg/a:0\@!\zs\d\+ +nygnop  :/^start:/,/^end:/wq! test.out  ENDTEST @@ -108,6 +110,11 @@ 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 diff --git a/src/nvim/testdir/test53.ok b/src/nvim/testdir/test53.ok index d7ffa6bc51..0c0b9ded16 100644 --- a/src/nvim/testdir/test53.ok +++ b/src/nvim/testdir/test53.ok @@ -49,6 +49,12 @@ 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 diff --git a/src/nvim/version.c b/src/nvim/version.c index c1fe19bb9c..bfae69e2a7 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -187,7 +187,7 @@ static int included_patches[] = {    //554,    //553,    552, -  //551, +  551,    //550,    549,    //548 NA | 
