# HG changeset patch # User Bram Moolenaar # Date 1344437475 -7200 # Node ID dc65e6429d2c1b79719455d7303f3f95c5897965 # Parent 9f4d5a5e3ee7f6b95caa09cf8a52cb898de442be updated for version 7.3.627 Problem: When using the "n" flag with the ":s" command a \= substitution will not be evaluated. Solution: Do perform the evaluation, so that a function can be invoked at every matching position without changing the text. (Christian Brabandt) diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -4264,6 +4264,9 @@ do_sub(eap) int endcolumn = FALSE; /* cursor in last column when done */ pos_T old_cursor = curwin->w_cursor; int start_nsubs; +#ifdef FEAT_EVAL + int save_ma = 0; +#endif cmd = eap->arg; if (!global_busy) @@ -4668,7 +4671,12 @@ do_sub(eap) } sub_nsubs++; did_sub = TRUE; - goto skip; +#ifdef FEAT_EVAL + /* Skip the substitution, unless an expression is used, + * then it is evaluated in the sandbox. */ + if (!(sub[0] == '\\' && sub[1] == '=')) +#endif + goto skip; } if (do_ask) @@ -4840,10 +4848,27 @@ do_sub(eap) /* * 3. substitute the string. */ +#ifdef FEAT_EVAL + if (do_count) + { + /* prevent accidently changing the buffer by a function */ + save_ma = curbuf->b_p_ma; + curbuf->b_p_ma = FALSE; + sandbox++; + } +#endif /* get length of substitution part */ sublen = vim_regsub_multi(®match, sub_firstlnum - regmatch.startpos[0].lnum, sub, sub_firstline, FALSE, p_magic, TRUE); +#ifdef FEAT_EVAL + if (do_count) + { + curbuf->b_p_ma = save_ma; + sandbox--; + goto skip; + } +#endif /* When the match included the "$" of the last line it may * go beyond the last line of the buffer. */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 627, +/**/ 626, /**/ 625,