Mercurial > vim
diff src/ex_cmds.c @ 3736:dc65e6429d2c v7.3.627
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)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 08 Aug 2012 16:51:15 +0200 |
parents | 5aad2c444a00 |
children | ece544e85821 |
line wrap: on
line diff
--- 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. */