changeset 5120:6e611380b4cf v7.3.1303

updated for version 7.3.1303 Problem: Undo is synced whenever CTRL-R = is called, breaking some plugins. Solution: Only break undo when calling setline() or append().
author Bram Moolenaar <bram@vim.org>
date Thu, 04 Jul 2013 20:25:41 +0200
parents 58686d48772e
children 2b4e86c9696c
files src/edit.c src/eval.c src/globals.h src/testdir/test61.in src/testdir/test61.ok src/version.c
diffstat 6 files changed, 43 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -8135,9 +8135,9 @@ ins_reg()
 # ifdef USE_IM_CONTROL
 	int	im_on = im_get_status();
 # endif
-	/* Sync undo, so the effect of e.g., setline() can be undone. */
-	u_sync(TRUE);
-	ins_need_undo = TRUE;
+	/* Sync undo when evaluating the expression calls setline() or
+	 * append(), so that it can be undone separately. */
+	u_sync_once = 2;
 
 	regname = get_expr_register();
 # ifdef USE_IM_CONTROL
@@ -8178,6 +8178,9 @@ ins_reg()
 #ifdef FEAT_EVAL
     }
     --no_u_sync;
+    if (u_sync_once == 1)
+	ins_need_undo = TRUE;
+    u_sync_once = 0;
 #endif
 #ifdef FEAT_CMDL_INFO
     clear_showcmd();
--- a/src/eval.c
+++ b/src/eval.c
@@ -8742,6 +8742,14 @@ f_append(argvars, rettv)
     typval_T	*tv;
     long	added = 0;
 
+    /* When coming here from Insert mode, sync undo, so that this can be
+     * undone separately from what was previously inserted. */
+    if (u_sync_once == 2)
+    {
+	u_sync_once = 1; /* notify that u_sync() was called */
+	u_sync(TRUE);
+    }
+
     lnum = get_tv_lnum(argvars);
     if (lnum >= 0
 	    && lnum <= curbuf->b_ml.ml_line_count
@@ -16408,6 +16416,15 @@ f_setline(argvars, rettv)
 	rettv->vval.v_number = 1;	/* FAIL */
 	if (line == NULL || lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
 	    break;
+
+	/* When coming here from Insert mode, sync undo, so that this can be
+	 * undone separately from what was previously inserted. */
+	if (u_sync_once == 2)
+	{
+	    u_sync_once = 1; /* notify that u_sync() was called */
+	    u_sync(TRUE);
+	}
+
 	if (lnum <= curbuf->b_ml.ml_line_count)
 	{
 	    /* existing line, replace it */
--- a/src/globals.h
+++ b/src/globals.h
@@ -916,6 +916,10 @@ EXTERN int no_zero_mapping INIT(= 0);	/*
 EXTERN int allow_keys INIT(= FALSE);	/* allow key codes when no_mapping
 					 * is set */
 EXTERN int no_u_sync INIT(= 0);		/* Don't call u_sync() */
+#ifdef FEAT_EVAL
+EXTERN int u_sync_once INIT(= 0);	/* Call u_sync() once when evaluating
+					   an expression. */
+#endif
 
 EXTERN int restart_edit INIT(= 0);	/* call edit when next cmd finished */
 EXTERN int arrow_used;			/* Normally FALSE, set to TRUE after
--- a/src/testdir/test61.in
+++ b/src/testdir/test61.in
@@ -93,7 +93,17 @@ ob
 :set ul=100
 o1a2=setline('.','1234')
 
-uu:%w >>test.out
+uu:"
+oc
+:set ul=100
+o1a2=setline('.','1234')
+
+u:"
+od
+:set ul=100
+o1a2=string(123)
+u:"
+:%w >>test.out
 :qa!
 ENDTEST
 
--- a/src/testdir/test61.ok
+++ b/src/testdir/test61.ok
@@ -44,3 +44,6 @@ three
 
 a
 b
+c
+12
+d
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1303,
+/**/
     1302,
 /**/
     1301,