1
0
forked from aniani/vim

patch 9.1.0672: marker folds may get corrupted on undo

Problem:  marker folds may get corrupted on undo (Yousef Mohammed)
Solution: when adjusting folds, make sure that line1 is the lower limit
          and line2 is the upper line limit. In particular, line2 should
          not be able to get smaller than line1.

fixes: #15455
closes: #15466

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2024-08-11 20:12:41 +02:00
parent fb3f969936
commit 8d02e5cf96
3 changed files with 28 additions and 0 deletions

View File

@@ -1492,6 +1492,9 @@ deleteFoldRecurse(garray_T *gap)
// foldMarkAdjust() {{{2
/*
* Update line numbers of folds for inserted/deleted lines.
*
* We are adjusting the folds in the range from line1 til line2,
* make sure that line2 does not get smaller than line1
*/
void
foldMarkAdjust(
@@ -1505,6 +1508,8 @@ foldMarkAdjust(
// lines, set line2 so that only deleted lines have their folds removed.
if (amount == MAXLNUM && line2 >= line1 && line2 - line1 >= -amount_after)
line2 = line1 - amount_after - 1;
if (line2 < line1)
line2 = line1;
// If appending a line in Insert mode, it should be included in the fold
// just above the line.
if ((State & MODE_INSERT) && amount == (linenr_T)1 && line2 == MAXLNUM)

View File

@@ -1928,4 +1928,25 @@ func Test_cursor_down_fold_eob()
call assert_equal(4, line('.'))
bwipe!
endfunc
" issue: #15455
func Test_cursor_fold_marker_undo()
new
call setline(1, ['{{{', '', 'This is a Line', '', 'This is a Line', '', '}}}'])
let &ul=&ul
setl foldmethod=marker
call cursor(2, 1)
norm! zo1vjdu
call assert_equal(1, foldlevel('.'))
bwipe!
new
call setline(1, ['', '{{{', '', 'This is a Line', '', 'This is a Line', '', '}}}'])
let &ul=&ul
setl foldmethod=marker
call cursor(3, 1)
norm! zo
norm! vjdu
call assert_equal(1, foldlevel('.'))
bwipe!
endfunc

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
672,
/**/
671,
/**/