summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-07-04 20:25:41 +0200
committerBram Moolenaar <Bram@vim.org>2013-07-04 20:25:41 +0200
commit3c1e9c2a1f415b5299282ab76b90465a2e064333 (patch)
tree0d49b6d4eb9c06cfb9b1bafb32b02b3235691462
parentc84e3c1ee1cc3bc79dc5c313df593670528ac395 (diff)
updated for version 7.3.1303v7.3.1303
Problem: Undo is synced whenever CTRL-R = is called, breaking some plugins. Solution: Only break undo when calling setline() or append().
-rw-r--r--src/edit.c9
-rw-r--r--src/eval.c17
-rw-r--r--src/globals.h4
-rw-r--r--src/testdir/test61.in12
-rw-r--r--src/testdir/test61.ok3
-rw-r--r--src/version.c2
6 files changed, 43 insertions, 4 deletions
diff --git a/src/edit.c b/src/edit.c
index ee308bd799..b76ebe5c10 100644
--- 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();
diff --git a/src/eval.c b/src/eval.c
index 5cac7b4adf..2a2817e6d2 100644
--- 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 */
diff --git a/src/globals.h b/src/globals.h
index 1e966cfec3..feb1dd4577 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -916,6 +916,10 @@ EXTERN int no_zero_mapping INIT(= 0); /* mapping zero not allowed */
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
diff --git a/src/testdir/test61.in b/src/testdir/test61.in
index 422adb897c..dc24ab9804 100644
--- 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
diff --git a/src/testdir/test61.ok b/src/testdir/test61.ok
index 0e3a525088..ea4b473ad7 100644
--- a/src/testdir/test61.ok
+++ b/src/testdir/test61.ok
@@ -44,3 +44,6 @@ three
a
b
+c
+12
+d
diff --git a/src/version.c b/src/version.c
index e84ea52302..7b6b20d3db 100644
--- 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,