mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 8.0.0408: updating folds does not always work properly
Problem: Updating folds does not work properly when inserting a file and a few other situations. Solution: Adjust the way folds are updated. (Matthew Malcomson)
This commit is contained in:
64
src/fold.c
64
src/fold.c
@@ -2505,7 +2505,11 @@ foldUpdateIEMSRecurse(
|
||||
* before where we started looking, extend it. If it
|
||||
* starts at another line, update nested folds to keep
|
||||
* their position, compensating for the new fd_top. */
|
||||
if (fp->fd_top >= startlnum && fp->fd_top != firstlnum)
|
||||
if (fp->fd_top == firstlnum)
|
||||
{
|
||||
/* have found a fold beginning where we want */
|
||||
}
|
||||
else if (fp->fd_top >= startlnum)
|
||||
{
|
||||
if (fp->fd_top > firstlnum)
|
||||
/* like lines are inserted */
|
||||
@@ -2523,18 +2527,44 @@ foldUpdateIEMSRecurse(
|
||||
fp->fd_top = firstlnum;
|
||||
fold_changed = TRUE;
|
||||
}
|
||||
else if (flp->start != 0 && lvl == level
|
||||
&& fp->fd_top != firstlnum)
|
||||
else if ((flp->start != 0 && lvl == level)
|
||||
|| firstlnum != startlnum)
|
||||
{
|
||||
/* Existing fold that includes startlnum must stop
|
||||
* if we find the start of a new fold at the same
|
||||
* level. Split it. Delete contained folds at
|
||||
* this point to split them too. */
|
||||
foldRemove(&fp->fd_nested, flp->lnum - fp->fd_top,
|
||||
flp->lnum - fp->fd_top);
|
||||
linenr_T breakstart;
|
||||
linenr_T breakend;
|
||||
|
||||
/*
|
||||
* Before there was a fold spanning from above
|
||||
* startlnum to below firstlnum. This fold is valid
|
||||
* above startlnum (because we are not updating
|
||||
* that range), but there should now be a break in
|
||||
* it.
|
||||
* If the break is because we are now forced to
|
||||
* start a new fold at the level "level" at line
|
||||
* fline->lnum, then we need to split the fold at
|
||||
* fline->lnum.
|
||||
* If the break is because the range
|
||||
* [startlnum, firstlnum) is now at a lower indent
|
||||
* than "level", we need to split the fold in this
|
||||
* range.
|
||||
* Any splits have to be done recursively.
|
||||
*/
|
||||
if (firstlnum != startlnum)
|
||||
{
|
||||
breakstart = startlnum;
|
||||
breakend = firstlnum;
|
||||
}
|
||||
else
|
||||
{
|
||||
breakstart = flp->lnum;
|
||||
breakend = flp->lnum;
|
||||
}
|
||||
foldRemove(&fp->fd_nested, breakstart - fp->fd_top,
|
||||
breakend - fp->fd_top);
|
||||
i = (int)(fp - (fold_T *)gap->ga_data);
|
||||
foldSplit(gap, i, flp->lnum, flp->lnum - 1);
|
||||
foldSplit(gap, i, breakstart, breakend - 1);
|
||||
fp = (fold_T *)gap->ga_data + i + 1;
|
||||
|
||||
/* If using the "marker" or "syntax" method, we
|
||||
* need to continue until the end of the fold is
|
||||
* found. */
|
||||
@@ -2543,6 +2573,20 @@ foldUpdateIEMSRecurse(
|
||||
|| getlevel == foldlevelSyntax)
|
||||
finish = TRUE;
|
||||
}
|
||||
|
||||
if (fp->fd_top == startlnum && concat)
|
||||
{
|
||||
i = (int)(fp - (fold_T *)gap->ga_data);
|
||||
if (i != 0)
|
||||
{
|
||||
fp2 = fp - 1;
|
||||
if (fp2->fd_top + fp2->fd_len == fp->fd_top)
|
||||
{
|
||||
foldMerge(fp2, gap, fp);
|
||||
fp = fp2;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (fp->fd_top >= startlnum)
|
||||
|
Reference in New Issue
Block a user