]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.627 v7.3.627
authorBram Moolenaar <Bram@vim.org>
Wed, 8 Aug 2012 14:51:15 +0000 (16:51 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 8 Aug 2012 14:51:15 +0000 (16:51 +0200)
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)

src/ex_cmds.c
src/version.c

index 01e820dd6e336c6a750e4666a4ae9f934e676685..f715af6a8fac7f75476b3ba20beb8c6869765b20 100644 (file)
@@ -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(&regmatch,
                                    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. */
index 44df68dd73b9acd82e9e5a1f46af6ffc38ab54e7..8a5054a6b9d7c12b32e225f86fce4bd910c90d05 100644 (file)
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    627,
 /**/
     626,
 /**/