diff options
| -rw-r--r-- | src/nvim/fold.c | 3 | ||||
| -rw-r--r-- | src/nvim/regexp.c | 26 | ||||
| -rw-r--r-- | src/nvim/regexp_nfa.c | 35 | ||||
| -rw-r--r-- | src/nvim/testdir/test_fold.vim | 7 | ||||
| -rw-r--r-- | src/nvim/testdir/test_regexp_utf8.vim | 11 | 
5 files changed, 54 insertions, 28 deletions
diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 654aa6d5ba..0593c16999 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -902,8 +902,9 @@ int foldMoveTo(      bool last = false;      for (;; ) {        if (!foldFind(gap, curwin->w_cursor.lnum - lnum_off, &fp)) { -        if (!updown) +        if (!updown || gap->ga_len == 0) {            break; +        }          /* When moving up, consider a fold above the cursor; when           * moving down consider a fold below the cursor. */ diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 2878e73573..fb08cd2727 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -3605,19 +3605,21 @@ theend:    if (backpos.ga_maxlen > BACKPOS_INITIAL)      ga_clear(&backpos); -  // Make sure the end is never before the start.  Can happen when \zs and -  // \ze are used. -  if (REG_MULTI) { -    const lpos_T *const start = &rex.reg_mmatch->startpos[0]; -    const lpos_T *const end = &rex.reg_mmatch->endpos[0]; +  if (retval > 0) { +    // Make sure the end is never before the start.  Can happen when \zs +    // and \ze are used. +    if (REG_MULTI) { +      const lpos_T *const start = &rex.reg_mmatch->startpos[0]; +      const lpos_T *const end = &rex.reg_mmatch->endpos[0]; -    if (end->lnum < start->lnum -        || (end->lnum == start->lnum && end->col < start->col)) { -      rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; -    } -  } else { -    if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { -      rex.reg_match->endp[0] = rex.reg_match->startp[0]; +      if (end->lnum < start->lnum +          || (end->lnum == start->lnum && end->col < start->col)) { +        rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; +      } +    } else { +      if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { +        rex.reg_match->endp[0] = rex.reg_match->startp[0]; +      }      }    } diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 22cd6baf6e..d38719f396 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -5243,9 +5243,12 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start,        switch (t->state->c) {        case NFA_MATCH:        { -        // If the match ends before a composing characters and -        // rex.reg_icombine is not set, that is not really a match. -        if (!rex.reg_icombine && utf_iscomposing(curc)) { +        // If the match is not at the start of the line, ends before a +        // composing characters and rex.reg_icombine is not set, that +        // is not really a match. +        if (!rex.reg_icombine +            && rex.input != rex.line +            && utf_iscomposing(curc)) {            break;          }          nfa_match = true; @@ -6591,19 +6594,21 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol,  #endif  theend: -  // Make sure the end is never before the start.  Can happen when \zs and -  // \ze are used. -  if (REG_MULTI) { -    const lpos_T *const start = &rex.reg_mmatch->startpos[0]; -    const lpos_T *const end = &rex.reg_mmatch->endpos[0]; +  if (retval > 0) { +    // Make sure the end is never before the start.  Can happen when \zs and +    // \ze are used. +    if (REG_MULTI) { +      const lpos_T *const start = &rex.reg_mmatch->startpos[0]; +      const lpos_T *const end = &rex.reg_mmatch->endpos[0]; -    if (end->lnum < start->lnum -        || (end->lnum == start->lnum && end->col < start->col)) { -      rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; -    } -  } else if (retval > 0) { -    if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { -      rex.reg_match->endp[0] = rex.reg_match->startp[0]; +      if (end->lnum < start->lnum +          || (end->lnum == start->lnum && end->col < start->col)) { +        rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; +      } +    } else { +      if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { +        rex.reg_match->endp[0] = rex.reg_match->startp[0]; +      }      }    } diff --git a/src/nvim/testdir/test_fold.vim b/src/nvim/testdir/test_fold.vim index 3c90c45952..88ce64b9eb 100644 --- a/src/nvim/testdir/test_fold.vim +++ b/src/nvim/testdir/test_fold.vim @@ -815,4 +815,11 @@ func Test_fold_create_delete_create()    bwipe!  endfunc +" this was crashing +func Test_fold_create_delete() +  new +  norm zFzFzdzj +  bwipe! +endfunc +  " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_regexp_utf8.vim b/src/nvim/testdir/test_regexp_utf8.vim index 4466ad436a..513780938e 100644 --- a/src/nvim/testdir/test_regexp_utf8.vim +++ b/src/nvim/testdir/test_regexp_utf8.vim @@ -533,4 +533,15 @@ func Test_search_with_end_offset()    close!  endfunc +" Check that "^" matches even when the line starts with a combining char +func Test_match_start_of_line_combining() +  new +  call setline(1, ['', "\u05ae", '']) +  exe "normal gg/^\<CR>" +  call assert_equal(2, getcurpos()[1]) +  bwipe! +endfunc + + +  " vim: shiftwidth=2 sts=2 expandtab  | 
