diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/ex_cmds.c | 189 | 
1 files changed, 96 insertions, 93 deletions
| diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index bae0ab6862..2f522ac6d0 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -2931,7 +2931,6 @@ void sub_set_replacement(SubReplacementString sub)   */  void do_sub(exarg_T *eap)  { -  linenr_T lnum;    long i = 0;    regmmatch_T regmatch;    static subflags_T subflags = { @@ -2944,30 +2943,24 @@ void do_sub(exarg_T *eap)      .do_number = false,      .do_ic = kSubHonorOptions    }; -  bool save_do_all;                      // remember user specified 'g' flag -  bool save_do_ask;                      // remember user specified 'c' flag -  char_u      *pat = NULL, *sub = NULL;         /* init for GCC */ +  char_u *pat = NULL, *sub = NULL;  // init for GCC    int delimiter;    int sublen; -  int got_quit = FALSE; -  int got_match = FALSE; -  int temp; +  int got_quit = false; +  int got_match = false;    int which_pat; -  char_u      *cmd; -  int save_State; -  linenr_T first_line = 0;              /* first changed line */ -  linenr_T last_line= 0;                /* below last changed line AFTER the -                                         * change */ +  char_u *cmd = eap->arg; +  linenr_T first_line = 0;  // first changed line +  linenr_T last_line= 0;    // below last changed line AFTER the +                            // change    linenr_T old_line_count = curbuf->b_ml.ml_line_count;    linenr_T line2; -  long nmatch;                          /* number of lines in match */    char_u      *sub_firstline;           /* allocated copy of first sub line */    int endcolumn = FALSE;                /* cursor in last column when done */    pos_T old_cursor = curwin->w_cursor;    int start_nsubs;    int save_ma = 0; -  cmd = eap->arg;    if (!global_busy) {      sub_nsubs = 0;      sub_nlines = 0; @@ -3107,38 +3100,39 @@ void do_sub(exarg_T *eap)    while (*cmd) {      // Note that 'g' and 'c' are always inverted.      // 'r' is never inverted. -    if (*cmd == 'g') +    if (*cmd == 'g') {        subflags.do_all = !subflags.do_all; -    else if (*cmd == 'c') +    } else if (*cmd == 'c') {        subflags.do_ask = !subflags.do_ask; -    else if (*cmd == 'n') +    } else if (*cmd == 'n') {        subflags.do_count = true; -    else if (*cmd == 'e') +    } else if (*cmd == 'e') {        subflags.do_error = !subflags.do_error; -    else if (*cmd == 'r')           /* use last used regexp */ +    } else if (*cmd == 'r') {  // use last used regexp        which_pat = RE_LAST; -    else if (*cmd == 'p') +    } else if (*cmd == 'p') {        subflags.do_print = true; -    else if (*cmd == '#') { +    } else if (*cmd == '#') {        subflags.do_print = true;        subflags.do_number = true;      } else if (*cmd == 'l') {        subflags.do_print = true;        subflags.do_list = true; -    } else if (*cmd == 'i')         /* ignore case */ +    } else if (*cmd == 'i') {  // ignore case        subflags.do_ic = kSubIgnoreCase; -    else if (*cmd == 'I')           /* don't ignore case */ +    } else if (*cmd == 'I') {  // don't ignore case        subflags.do_ic = kSubMatchCase; -    else +    } else {        break; -    ++cmd; +    } +    cmd++;    }    if (subflags.do_count) {      subflags.do_ask = false;    } -  save_do_all = subflags.do_all; -  save_do_ask = subflags.do_ask; +  bool save_do_all = subflags.do_all;  // remember user specified 'g' flag +  bool save_do_ask = subflags.do_ask;  // remember user specified 'c' flag    // check for a trailing count    cmd = skipwhite(cmd); @@ -3170,23 +3164,24 @@ void do_sub(exarg_T *eap)      return;    if (!subflags.do_count && !MODIFIABLE(curbuf)) { -    /* Substitution is not allowed in non-'modifiable' buffer */ +    // Substitution is not allowed in non-'modifiable' buffer      EMSG(_(e_modifiable));      return;    } -  if (search_regcomp(pat, RE_SUBST, which_pat, SEARCH_HIS, -          ®match) == FAIL) { -    if (subflags.do_error) +  if (search_regcomp(pat, RE_SUBST, which_pat, SEARCH_HIS, ®match) == FAIL) { +    if (subflags.do_error) {        EMSG(_(e_invcmd)); +    }      return;    } -  /* the 'i' or 'I' flag overrules 'ignorecase' and 'smartcase' */ -  if (subflags.do_ic == kSubIgnoreCase) -    regmatch.rmm_ic = TRUE; -  else if (subflags.do_ic == kSubMatchCase) -    regmatch.rmm_ic = FALSE; +  // the 'i' or 'I' flag overrules 'ignorecase' and 'smartcase' +  if (subflags.do_ic == kSubIgnoreCase) { +    regmatch.rmm_ic = true; +  } else if (subflags.do_ic == kSubMatchCase) { +    regmatch.rmm_ic = false; +  }    sub_firstline = NULL; @@ -3198,15 +3193,13 @@ void do_sub(exarg_T *eap)    if (!(sub[0] == '\\' && sub[1] == '='))      sub = regtilde(sub, p_magic); -  /* -   * Check for a match on each line. -   */ +  // Check for a match on each line.    line2 = eap->line2; -  for (lnum = eap->line1; lnum <= line2 && !(got_quit -                                             || aborting() -                                             ); ++lnum) { -    nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, -        (colnr_T)0, NULL); +  for (linenr_T lnum = eap->line1; +       lnum <= line2 && !(got_quit || aborting()); +       lnum++) { +    long nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, +                                    (colnr_T)0, NULL);      if (nmatch) {        colnr_T copycol;        colnr_T matchcol; @@ -3333,15 +3326,13 @@ void do_sub(exarg_T *eap)          matchcol = regmatch.endpos[0].col;          prev_matchcol = matchcol; -        /* -         * 2. If subflags.do_count is set only increase the counter. -         *    If do_ask is set, ask for confirmation. -         */ +        // 2. If subflags.do_count is set only increase the counter. +        //    If do_ask is set, ask for confirmation.          if (subflags.do_count) { -          /* For a multi-line match, put matchcol at the NUL at -           * the end of the line and set nmatch to one, so that -           * we continue looking for a match on the next line. -           * Avoids that ":s/\nB\@=//gc" get stuck. */ +          // For a multi-line match, put matchcol at the NUL at +          // the end of the line and set nmatch to one, so that +          // we continue looking for a match on the next line. +          // Avoids that ":s/\nB\@=//gc" get stuck.            if (nmatch > 1) {              matchcol = (colnr_T)STRLEN(sub_firstline);              nmatch = 1; @@ -3360,7 +3351,7 @@ void do_sub(exarg_T *eap)            /* change State to CONFIRM, so that the mouse works             * properly */ -          save_State = State; +          int save_State = State;            State = CONFIRM;            setmouse();                   /* disable mouse in xterm */            curwin->w_cursor.col = regmatch.startpos[0].col; @@ -3407,7 +3398,7 @@ void do_sub(exarg_T *eap)                curwin->w_p_fen = FALSE;                /* Invert the matched string.                 * Remove the inversion afterwards. */ -              temp = RedrawingDisabled; +              int temp = RedrawingDisabled;                RedrawingDisabled = 0;                if (new_start != NULL) { @@ -3487,13 +3478,13 @@ void do_sub(exarg_T *eap)              if (typed == 'y')                break;              if (typed == 'l') { -              /* last: replace and then stop */ +              // last: replace and then stop                subflags.do_all = false;                line2 = lnum;                break;              }              if (typed == 'a') { -              subflags.do_ask = FALSE; +              subflags.do_ask = false;                break;              }              if (typed == Ctrl_E) @@ -3530,24 +3521,25 @@ void do_sub(exarg_T *eap)           * 3. substitute the string.           */          if (subflags.do_count) { -          /* prevent accidentally changing the buffer by a function */ +          // prevent accidentally changing the buffer by a function            save_ma = curbuf->b_p_ma; -          curbuf->b_p_ma = FALSE; +          curbuf->b_p_ma = false;            sandbox++;          }          // Save flags for recursion.  They can change for e.g.          // :s/^/\=execute("s#^##gn")          subflags_T subflags_save = subflags; -        /* get length of substitution part */ +        // get length of substitution part          sublen = vim_regsub_multi(®match, -            sub_firstlnum - regmatch.startpos[0].lnum, -            sub, sub_firstline, FALSE, p_magic, TRUE); +                                  sub_firstlnum - regmatch.startpos[0].lnum, +                                  sub, sub_firstline, false, p_magic, true);          // Don't keep flags set by a recursive call          subflags = subflags_save;          if (subflags.do_count) {            curbuf->b_p_ma = save_ma; -          if (sandbox > 0) +          if (sandbox > 0) {              sandbox--; +          }            goto skip;          } @@ -3620,11 +3612,12 @@ void do_sub(exarg_T *eap)            sub_firstlnum += nmatch - 1;            xfree(sub_firstline);            sub_firstline = vim_strsave(ml_get(sub_firstlnum)); -          /* When going beyond the last line, stop substituting. */ -          if (sub_firstlnum <= line2) -            do_again = TRUE; -          else +          // When going beyond the last line, stop substituting. +          if (sub_firstlnum <= line2) { +            do_again = true; +          } else {              subflags.do_all = false; +          }          }          /* Remember next character to be copied. */ @@ -3655,11 +3648,12 @@ void do_sub(exarg_T *eap)                ml_append(lnum - 1, new_start,                    (colnr_T)(p1 - new_start + 1), FALSE);                mark_adjust(lnum + 1, (linenr_T)MAXLNUM, 1L, 0L); -              if (subflags.do_ask) +              if (subflags.do_ask) {                  appended_lines(lnum - 1, 1L); -              else { -                if (first_line == 0) +              } else { +                if (first_line == 0) {                    first_line = lnum; +                }                  last_line = lnum + 1;                }                /* All line numbers increase. */ @@ -3676,12 +3670,10 @@ void do_sub(exarg_T *eap)              p1 += (*mb_ptr2len)(p1) - 1;          } -        /* -         * 4. If subflags.do_all is set, find next match. -         * Prevent endless loop with patterns that match empty -         * strings, e.g. :s/$/pat/g or :s/[a-z]* /(&)/g. -         * But ":s/\n/#/" is OK. -         */ +        // 4. If subflags.do_all is set, find next match. +        // Prevent endless loop with patterns that match empty +        // strings, e.g. :s/$/pat/g or :s/[a-z]* /(&)/g. +        // But ":s/\n/#/" is OK.  skip:          /* We already know that we did the last subst when we are at           * the end of the line, except that a pattern like @@ -3742,21 +3734,23 @@ skip:                for (i = 0; i < nmatch_tl; ++i)                  ml_delete(lnum, (int)FALSE);                mark_adjust(lnum, lnum + nmatch_tl - 1, -                  (long)MAXLNUM, -nmatch_tl); -              if (subflags.do_ask) +                          (long)MAXLNUM, -nmatch_tl); +              if (subflags.do_ask) {                  deleted_lines(lnum, nmatch_tl); -              --lnum; -              line2 -= nmatch_tl;               /* nr of lines decreases */ +              } +              lnum--; +              line2 -= nmatch_tl;  // nr of lines decreases                nmatch_tl = 0;              }              /* When asking, undo is saved each time, must also set               * changed flag each time. */ -            if (subflags.do_ask) +            if (subflags.do_ask) {                changed_bytes(lnum, 0); -            else { -              if (first_line == 0) +            } else { +              if (first_line == 0) {                  first_line = lnum; +              }                last_line = lnum + 1;              } @@ -3809,9 +3803,10 @@ skip:    xfree(sub_firstline);   /* may have to free allocated copy of the line */ -  /* ":s/pat//n" doesn't move the cursor */ -  if (subflags.do_count) +  // ":s/pat//n" doesn't move the cursor +  if (subflags.do_count) {      curwin->w_cursor = old_cursor; +  }    if (sub_nsubs > start_nsubs) {      /* Set the '[ and '] marks. */ @@ -3822,24 +3817,32 @@ skip:      if (!global_busy) {        // when interactive leave cursor on the match        if (!subflags.do_ask) { -        if (endcolumn) +        if (endcolumn) {            coladvance((colnr_T)MAXCOL); -        else +        } else {            beginline(BL_WHITE | BL_FIX); +        }        } -      if (!do_sub_msg(subflags.do_count) && subflags.do_ask) +      if (!do_sub_msg(subflags.do_count) && subflags.do_ask) {          MSG(""); -    } else -      global_need_beginline = TRUE; -    if (subflags.do_print) +      } +    } else { +      global_need_beginline = true; +    } +    if (subflags.do_print) {        print_line(curwin->w_cursor.lnum, subflags.do_number, subflags.do_list); +    }    } else if (!global_busy) { -    if (got_int)                /* interrupted */ +    if (got_int) { +      // interrupted        EMSG(_(e_interr)); -    else if (got_match)         /* did find something but nothing substituted */ +    } else if (got_match) { +      // did find something but nothing substituted        MSG(""); -    else if (subflags.do_error)          /* nothing found */ +    } else if (subflags.do_error) { +      // nothing found        EMSG2(_(e_patnotf2), get_search_pat()); +    }    }    if (subflags.do_ask && hasAnyFolding(curwin)) { | 
