diff options
-rw-r--r-- | src/edit.c | 9 | ||||
-rw-r--r-- | src/eval.c | 17 | ||||
-rw-r--r-- | src/globals.h | 4 | ||||
-rw-r--r-- | src/testdir/test61.in | 12 | ||||
-rw-r--r-- | src/testdir/test61.ok | 3 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |