diff src/fold.c @ 11156:80241603dd50 v8.0.0465

patch 8.0.0465: off-by-one error in using :move with folding commit https://github.com/vim/vim/commit/40ebc0afda8d8e478d2090133ed6a3cd3d8da3ec Author: Bram Moolenaar <Bram@vim.org> Date: Thu Mar 16 15:59:14 2017 +0100 patch 8.0.0465: off-by-one error in using :move with folding Problem: Off-by-one error in using :move with folding. Solution: Correct off-by-one mistakes and add more tests. (Matthew Malcomson)
author Christian Brabandt <cb@256bit.org>
date Thu, 16 Mar 2017 16:00:05 +0100
parents 87779062d706
children f0602688b8ef
line wrap: on
line diff
--- a/src/fold.c
+++ b/src/fold.c
@@ -3021,8 +3021,9 @@ foldReverseOrder(garray_T *gap, linenr_T
     static void
 truncate_fold(fold_T *fp, linenr_T end)
 {
+    end += 1;
     foldRemove(&fp->fd_nested, end - fp->fd_top, MAXLNUM);
-    fp->fd_len = end - fp->fd_top + 1;
+    fp->fd_len = end - fp->fd_top;
 }
 
 #define fold_end(fp) ((fp)->fd_top + (fp)->fd_len - 1)
@@ -3062,7 +3063,7 @@ foldMoveRange(garray_T *gap, linenr_T li
 	}
 	else
 	    /* Case 2 truncate fold, folds after this one must be dealt with. */
-	    truncate_fold(fp, line1);
+	    truncate_fold(fp, line1 - 1);
 
 	/* Look at the next fold, and treat that one as if it were the first
 	 * after  "line1" (because now it is). */
@@ -3078,11 +3079,11 @@ foldMoveRange(garray_T *gap, linenr_T li
     }
     else if (fp->fd_top > line2)
     {
-	for (; valid_fold(fp, gap) && fold_end(fp) < dest; fp++)
+	for (; valid_fold(fp, gap) && fold_end(fp) <= dest; fp++)
 	/* Case 9. (for all case 9's) -- shift up. */
 	    fp->fd_top -= range_len;
 
-	if (valid_fold(fp, gap) && fp->fd_top < dest)
+	if (valid_fold(fp, gap) && fp->fd_top <= dest)
 	{
 	    /* Case 8. -- ensure truncated at dest, shift up */
 	    truncate_fold(fp, dest);