diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-08-08 16:51:15 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-08-08 16:51:15 +0200 |
commit | 07e31c571a13855cf67c69f3a676038510141699 (patch) | |
tree | 55f9c5cb3d39cb7f0838579caec49667261ea5ca /src/ex_cmds.c | |
parent | c1a995db49854947a94e60be918c03a643a4292c (diff) | |
download | vim-git-07e31c571a13855cf67c69f3a676038510141699.tar.gz |
updated for version 7.3.627v7.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)
Diffstat (limited to 'src/ex_cmds.c')
-rw-r--r-- | src/ex_cmds.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 01e820dd6..f715af6a8 100644 --- 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. */ |