changeset 15048:73f59cd01ba7 v8.1.0535

patch 8.1.0535: increment/decrement might get interrupted by updating folds commit https://github.com/vim/vim/commit/6b731886ca94d66b9bdedfb7e603af44a6400399 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Nov 16 20:54:47 2018 +0100 patch 8.1.0535: increment/decrement might get interrupted by updating folds Problem: Increment/decrement might get interrupted by updating folds. Solution: Disable fold updating for a moment. (Christian Brabandt, closes #3599)
author Bram Moolenaar <Bram@vim.org>
date Fri, 16 Nov 2018 21:00:06 +0100
parents 63e1c9a38553
children 8fd94c25a939
files src/ops.c src/version.c
diffstat 2 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ops.c
+++ b/src/ops.c
@@ -5549,12 +5549,27 @@ op_addsub(
     int			change_cnt = 0;
     linenr_T		amount = Prenum1;
 
+   // do_addsub() might trigger re-evaluation of 'foldexpr' halfway, when the
+   // buffer is not completly updated yet. Postpone updating folds until before
+   // the call to changed_lines().
+#ifdef FEAT_FOLDING
+   disable_fold_update++;
+#endif
+
     if (!VIsual_active)
     {
 	pos = curwin->w_cursor;
 	if (u_save_cursor() == FAIL)
+	{
+#ifdef FEAT_FOLDING
+	    disable_fold_update--;
+#endif
 	    return;
+	}
 	change_cnt = do_addsub(oap->op_type, &pos, 0, amount);
+#ifdef FEAT_FOLDING
+	disable_fold_update--;
+#endif
 	if (change_cnt)
 	    changed_lines(pos.lnum, 0, pos.lnum + 1, 0L);
     }
@@ -5566,7 +5581,12 @@ op_addsub(
 
 	if (u_save((linenr_T)(oap->start.lnum - 1),
 					(linenr_T)(oap->end.lnum + 1)) == FAIL)
+	{
+#ifdef FEAT_FOLDING
+	    disable_fold_update--;
+#endif
 	    return;
+	}
 
 	pos = oap->start;
 	for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
@@ -5624,6 +5644,10 @@ op_addsub(
 	    if (g_cmd && one_change)
 		amount += Prenum1;
 	}
+
+#ifdef FEAT_FOLDING
+	disable_fold_update--;
+#endif
 	if (change_cnt)
 	    changed_lines(oap->start.lnum, 0, oap->end.lnum + 1, 0L);
 
--- a/src/version.c
+++ b/src/version.c
@@ -793,6 +793,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    535,
+/**/
     534,
 /**/
     533,