diff options
author | Bram Moolenaar <Bram@vim.org> | 2015-04-15 12:43:50 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2015-04-15 12:43:50 +0200 |
commit | d5f6933d5c57ea6f79bbdeab6c426cf66a393f33 (patch) | |
tree | a195ad8661e0cd1ae02670e2365ff77ea64894c6 | |
parent | 05b20fb14ec3219d73014595cfb6cc28ae1e1fc3 (diff) | |
download | vim-git-d5f6933d5c57ea6f79bbdeab6c426cf66a393f33.tar.gz |
patch 7.4.700v7.4.700
Problem: Fold can't be opened after ":move". (Ein Brown)
Solution: Delete the folding information and update it afterwards.
(Christian Brabandt)
-rw-r--r-- | src/ex_cmds.c | 16 | ||||
-rw-r--r-- | src/fold.c | 4 | ||||
-rw-r--r-- | src/testdir/test45.in | 10 | ||||
-rw-r--r-- | src/testdir/test45.ok | 5 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 35 insertions, 2 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 978d516f7..1abda7423 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -741,6 +741,16 @@ do_move(line1, line2, dest) linenr_T extra; /* Num lines added before line1 */ linenr_T num_lines; /* Num lines moved */ linenr_T last_line; /* Last line in file after adding new text */ +#ifdef FEAT_FOLDING + int isFolded; + + /* Moving lines seems to corrupt the folds, delete folding info now + * and recreate it when finished. Don't do this for manual folding, it + * would delete all folds. */ + isFolded = hasAnyFolding(curwin) && !foldmethodIsManual(curwin); + if (isFolded) + deleteFoldRecurse(&curwin->w_folds); +#endif if (dest >= line1 && dest < line2) { @@ -839,6 +849,12 @@ do_move(line1, line2, dest) else changed_lines(dest + 1, 0, line1 + num_lines, 0L); +#ifdef FEAT_FOLDING + /* recreate folds */ + if (isFolded) + foldUpdateAll(curwin); +#endif + return OK; } diff --git a/src/fold.c b/src/fold.c index 671bbf75a..21e455bb1 100644 --- a/src/fold.c +++ b/src/fold.c @@ -847,8 +847,8 @@ foldUpdate(wp, top, bot) fold_T *fp; /* Mark all folds from top to bot as maybe-small. */ - (void)foldFind(&curwin->w_folds, top, &fp); - while (fp < (fold_T *)curwin->w_folds.ga_data + curwin->w_folds.ga_len + (void)foldFind(&wp->w_folds, top, &fp); + while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len && fp->fd_top < bot) { fp->fd_small = MAYBE; diff --git a/src/testdir/test45.in b/src/testdir/test45.in index e5af5073d..b1e8266ab 100644 --- a/src/testdir/test45.in +++ b/src/testdir/test45.in @@ -63,6 +63,16 @@ endfun :call append("$", foldlevel(".")) :/^last/+1,$w! test.out :delfun Flvl +:new +iTest fdm=indent and :move bug END +line2 + Test fdm=indent START + line3 + line4 +:set fdm=indent +:1m1 +2jzc:m0 +:%w >> test.out :qa! ENDTEST diff --git a/src/testdir/test45.ok b/src/testdir/test45.ok index f04996e33..0f25e6218 100644 --- a/src/testdir/test45.ok +++ b/src/testdir/test45.ok @@ -16,3 +16,8 @@ expr 2 1 2 0 + Test fdm=indent START + line3 + line4 +Test fdm=indent and :move bug END +line2 diff --git a/src/version.c b/src/version.c index 9d1eb7977..c03b9a4c5 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 700, +/**/ 699, /**/ 698, |