summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-01-21 17:03:07 +0100
committerBram Moolenaar <Bram@vim.org>2021-01-21 17:03:07 +0100
commite71996bd0865659bde5450f466bc3e53e83431b2 (patch)
treefe75fc9ed0da7b204c44b0447fec13b3896b2809
parent5e6a7aa2b26077775906eb8411952dc6259694de (diff)
downloadvim-git-e71996bd0865659bde5450f466bc3e53e83431b2.tar.gz
patch 8.2.2385: "gj" and "gk" do not work correctly when inside a foldv8.2.2385
Problem: "gj" and "gk" do not work correctly when inside a fold. Solution: Move check for folding. (closes #7724, closes #4095)
-rw-r--r--src/normal.c31
-rw-r--r--src/testdir/test_fold.vim35
-rw-r--r--src/version.c2
3 files changed, 48 insertions, 20 deletions
diff --git a/src/normal.c b/src/normal.c
index a5f5794c5..c70971f8e 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -2570,12 +2570,6 @@ nv_screengo(oparg_T *oap, int dir, long dist)
else
{
// to previous line
- if (curwin->w_cursor.lnum == 1)
- {
- retval = FAIL;
- break;
- }
- --curwin->w_cursor.lnum;
#ifdef FEAT_FOLDING
// Move to the start of a closed fold. Don't do that when
// 'foldopen' contains "all": it will open in a moment.
@@ -2583,6 +2577,13 @@ nv_screengo(oparg_T *oap, int dir, long dist)
(void)hasFolding(curwin->w_cursor.lnum,
&curwin->w_cursor.lnum, NULL);
#endif
+ if (curwin->w_cursor.lnum == 1)
+ {
+ retval = FAIL;
+ break;
+ }
+ --curwin->w_cursor.lnum;
+
linelen = linetabsize(ml_get_curline());
if (linelen > width1)
curwin->w_curswant += (((linelen - width1 - 1) / width2)
@@ -5957,13 +5958,8 @@ nv_g_cmd(cmdarg_T *cap)
*/
case 'j':
case K_DOWN:
- // with 'nowrap' it works just like the normal "j" command; also when
- // in a closed fold
- if (!curwin->w_p_wrap
-#ifdef FEAT_FOLDING
- || hasFolding(curwin->w_cursor.lnum, NULL, NULL)
-#endif
- )
+ // with 'nowrap' it works just like the normal "j" command.
+ if (!curwin->w_p_wrap)
{
oap->motion_type = MLINE;
i = cursor_down(cap->count1, oap->op_type == OP_NOP);
@@ -5976,13 +5972,8 @@ nv_g_cmd(cmdarg_T *cap)
case 'k':
case K_UP:
- // with 'nowrap' it works just like the normal "k" command; also when
- // in a closed fold
- if (!curwin->w_p_wrap
-#ifdef FEAT_FOLDING
- || hasFolding(curwin->w_cursor.lnum, NULL, NULL)
-#endif
- )
+ // with 'nowrap' it works just like the normal "k" command.
+ if (!curwin->w_p_wrap)
{
oap->motion_type = MLINE;
i = cursor_up(cap->count1, oap->op_type == OP_NOP);
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
index b978fc080..895a96b12 100644
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -859,4 +859,39 @@ func Test_fold_create_delete()
bwipe!
endfunc
+func Test_fold_relative_move()
+ enew!
+ set fdm=indent sw=2 wrap tw=80
+
+ let content = [ ' foo', ' bar', ' baz',
+ \ repeat('x', 100),
+ \ ' foo', ' bar', ' baz'
+ \ ]
+ call append(0, content)
+
+ normal zM
+
+ call cursor(3, 1)
+ call assert_true(foldclosed(line('.')))
+ normal gj
+ call assert_equal(2, winline())
+
+ 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())
+
+ call cursor(6, 1)
+ call assert_true(foldclosed(line('.')))
+ normal 2gk
+ call assert_equal(2, winline())
+
+ set fdm& sw& wrap& tw&
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index a90c64538..faa277743 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2385,
+/**/
2384,
/**/
2383,