patch 8.2.2711: "gj" in a closed fold does not move out of the fold
Problem: "gj" in a closed fold does not move out of the fold. (Marco Hinz)
Solution: Add a check for being in a closed fold. (closes #8062)
diff --git a/src/normal.c b/src/normal.c
index 4299a90..a15ae35 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -2564,7 +2564,11 @@
{
if (dir == BACKWARD)
{
- if ((long)curwin->w_curswant >= width1)
+ if ((long)curwin->w_curswant >= width1
+#ifdef FEAT_FOLDING
+ && !hasFolding(curwin->w_cursor.lnum, NULL, NULL)
+#endif
+ )
// Move back within the line. This can give a negative value
// for w_curswant if width1 < width2 (with cpoptions+=n),
// which will get clipped to column 0.
@@ -2598,7 +2602,11 @@
n = ((linelen - width1 - 1) / width2 + 1) * width2 + width1;
else
n = width1;
- if (curwin->w_curswant + width2 < (colnr_T)n)
+ if (curwin->w_curswant + width2 < (colnr_T)n
+#ifdef FEAT_FOLDING
+ && !hasFolding(curwin->w_cursor.lnum, NULL, NULL)
+#endif
+ )
// move forward within line
curwin->w_curswant += width2;
else
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
index 20171f0..e5dc1ec 100644
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -890,28 +890,33 @@
new
set fdm=indent sw=2 wrap tw=80
- let content = [ ' foo', ' bar', ' baz',
- \ repeat('x', &columns + 1),
- \ ' foo', ' bar', ' baz'
+ let longtext = repeat('x', &columns + 1)
+ let content = [ ' foo', ' ' .. longtext, ' baz',
+ \ longtext,
+ \ ' foo', ' ' .. longtext, ' baz'
\ ]
call append(0, content)
normal zM
- call cursor(3, 1)
- call assert_true(foldclosed(line('.')))
- normal gj
- call assert_equal(2, winline())
+ for lnum in range(1, 3)
+ call cursor(lnum, 1)
+ call assert_true(foldclosed(line('.')))
+ normal gj
+ call assert_equal(2, winline())
+ endfor
call cursor(2, 1)
call assert_true(foldclosed(line('.')))
normal 2gj
call assert_equal(3, winline())
- call cursor(5, 1)
- call assert_true(foldclosed(line('.')))
- normal gk
- call assert_equal(3, winline())
+ for lnum in range(5, 7)
+ call cursor(lnum, 1)
+ call assert_true(foldclosed(line('.')))
+ normal gk
+ call assert_equal(3, winline())
+ endfor
call cursor(6, 1)
call assert_true(foldclosed(line('.')))
diff --git a/src/version.c b/src/version.c
index db31f88..c9632c3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2711,
+/**/
2710,
/**/
2709,