diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-04-22 22:40:11 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-04-22 22:40:11 +0200 |
commit | 94be619e30e82d28cadeea5e0766c6f5c321ff8b (patch) | |
tree | e454f390de5e1e395ea5e260d0748d0db25434b4 /src | |
parent | f1d21c8cc83f40c815b6bf13cd2043152db533ee (diff) |
patch 8.0.0581: moving folded text is sometimes not correctv8.0.0581
Problem: Moving folded text is sometimes not correct.
Solution: Bail out when "move_end" is zero. (Matthew Malcomson)
Diffstat (limited to 'src')
-rw-r--r-- | src/fold.c | 10 | ||||
-rw-r--r-- | src/testdir/test_fold.vim | 71 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 61 insertions, 22 deletions
diff --git a/src/fold.c b/src/fold.c index 8c66b78cd0..8f068dccf1 100644 --- a/src/fold.c +++ b/src/fold.c @@ -3133,10 +3133,14 @@ foldMoveRange(garray_T *gap, linenr_T line1, linenr_T line2, linenr_T dest) dest_index = fold_index(fp, gap); /* - * All folds are now correct, but they are not necessarily in the correct - * order. We have to swap folds in the range [move_end, dest_index) with - * those in the range [move_start, move_end). + * All folds are now correct, but not necessarily in the correct order. We + * must swap folds in the range [move_end, dest_index) with those in the + * range [move_start, move_end). */ + if (move_end == 0) + /* There are no folds after those moved, hence no folds have been moved + * out of order. */ + return; foldReverseOrder(gap, (linenr_T)move_start, (linenr_T)dest_index - 1); foldReverseOrder(gap, (linenr_T)move_start, (linenr_T)(move_start + dest_index - move_end - 1)); diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim index a5b47d899b..213c0fa458 100644 --- a/src/testdir/test_fold.vim +++ b/src/testdir/test_fold.vim @@ -1,10 +1,10 @@ " Test for folding -func! PrepIndent(arg) +func PrepIndent(arg) return [a:arg] + repeat(["\t".a:arg], 5) endfu -func! Test_address_fold() +func Test_address_fold() new call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/', \ 'after fold 1', 'after fold 2', 'after fold 3']) @@ -68,17 +68,7 @@ func! Test_address_fold() quit! endfunc -func! Test_indent_fold() - new - call setline(1, ['', 'a', ' b', ' c']) - setl fen fdm=indent - 2 - norm! >> - let a=map(range(1,4), 'foldclosed(v:val)') - call assert_equal([-1,-1,-1,-1], a) -endfunc - -func! Test_indent_fold() +func Test_indent_fold() new call setline(1, ['', 'a', ' b', ' c']) setl fen fdm=indent @@ -89,7 +79,7 @@ func! Test_indent_fold() bw! endfunc -func! Test_indent_fold2() +func Test_indent_fold2() new call setline(1, ['', '{{{', '}}}', '{{{', '}}}']) setl fen fdm=marker @@ -122,7 +112,7 @@ func Test_manual_fold_with_filter() endfor endfunc -func! Test_indent_fold_with_read() +func Test_indent_fold_with_read() new set foldmethod=indent call setline(1, repeat(["\<Tab>a"], 4)) @@ -224,7 +214,11 @@ func Test_update_folds_expr_read() set foldmethod& foldexpr& endfunc -func! Test_move_folds_around_manual() +func Check_foldlevels(expected) + call assert_equal(a:expected, map(range(1, line('$')), 'foldlevel(v:val)')) +endfunc + +func Test_move_folds_around_manual() new let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c") call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c")) @@ -293,11 +287,50 @@ func! Test_move_folds_around_manual() 6m$ " The first fold has been truncated to the 5'th line. " Second fold has been moved up because the moved line is now below it. - call assert_equal([0, 1, 1, 1, 1, 0, 0, 0, 1, 0], map(range(1, line('$')), 'foldlevel(v:val)')) + call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 0]) + + %delete + set fdm=indent foldlevel=0 + call setline(1, [ + \ "a", + \ "\ta", + \ "\t\ta", + \ "\t\ta", + \ "\t\ta", + \ "a", + \ "a"]) + set fdm=manual + %foldopen! + 4,5m6 + call Check_foldlevels([0, 1, 2, 0, 0, 0, 0]) + + %delete + set fdm=indent + call setline(1, [ + \ "\ta", + \ "\t\ta", + \ "\t\ta", + \ "\t\ta", + \ "\ta", + \ "\t\ta", + \ "\t\ta", + \ "\t\ta", + \ "\ta", + \ "\t\ta", + \ "\t\ta", + \ "\t\ta", + \ "\t\ta", + \ "\ta", + \ "a"]) + set fdm=manual + %foldopen! + 13m7 + call Check_foldlevels([1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0]) + bw! endfunc -func! Test_move_folds_around_indent() +func Test_move_folds_around_indent() new let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c") call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c")) @@ -357,7 +390,7 @@ func! Test_move_folds_around_indent() 6m$ " The first fold has been truncated to the 5'th line. " Second fold has been moved up because the moved line is now below it. - call assert_equal([0, 1, 1, 1, 1, 0, 0, 0, 1, 1], map(range(1, line('$')), 'foldlevel(v:val)')) + call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 1]) bw! endfunc diff --git a/src/version.c b/src/version.c index c41cc5abba..3f74d6e396 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 581, +/**/ 580, /**/ 579, |