mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.2385: "gj" and "gk" do not work correctly when inside a fold
Problem: "gj" and "gk" do not work correctly when inside a fold. Solution: Move check for folding. (closes #7724, closes #4095)
This commit is contained in:
parent
5e6a7aa2b2
commit
e71996bd08
31
src/normal.c
31
src/normal.c
@ -2570,12 +2570,6 @@ nv_screengo(oparg_T *oap, int dir, long dist)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// to previous line
|
// to previous line
|
||||||
if (curwin->w_cursor.lnum == 1)
|
|
||||||
{
|
|
||||||
retval = FAIL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--curwin->w_cursor.lnum;
|
|
||||||
#ifdef FEAT_FOLDING
|
#ifdef FEAT_FOLDING
|
||||||
// Move to the start of a closed fold. Don't do that when
|
// Move to the start of a closed fold. Don't do that when
|
||||||
// 'foldopen' contains "all": it will open in a moment.
|
// '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,
|
(void)hasFolding(curwin->w_cursor.lnum,
|
||||||
&curwin->w_cursor.lnum, NULL);
|
&curwin->w_cursor.lnum, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
if (curwin->w_cursor.lnum == 1)
|
||||||
|
{
|
||||||
|
retval = FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
--curwin->w_cursor.lnum;
|
||||||
|
|
||||||
linelen = linetabsize(ml_get_curline());
|
linelen = linetabsize(ml_get_curline());
|
||||||
if (linelen > width1)
|
if (linelen > width1)
|
||||||
curwin->w_curswant += (((linelen - width1 - 1) / width2)
|
curwin->w_curswant += (((linelen - width1 - 1) / width2)
|
||||||
@ -5957,13 +5958,8 @@ nv_g_cmd(cmdarg_T *cap)
|
|||||||
*/
|
*/
|
||||||
case 'j':
|
case 'j':
|
||||||
case K_DOWN:
|
case K_DOWN:
|
||||||
// with 'nowrap' it works just like the normal "j" command; also when
|
// with 'nowrap' it works just like the normal "j" command.
|
||||||
// in a closed fold
|
if (!curwin->w_p_wrap)
|
||||||
if (!curwin->w_p_wrap
|
|
||||||
#ifdef FEAT_FOLDING
|
|
||||||
|| hasFolding(curwin->w_cursor.lnum, NULL, NULL)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
oap->motion_type = MLINE;
|
oap->motion_type = MLINE;
|
||||||
i = cursor_down(cap->count1, oap->op_type == OP_NOP);
|
i = cursor_down(cap->count1, oap->op_type == OP_NOP);
|
||||||
@ -5976,13 +5972,8 @@ nv_g_cmd(cmdarg_T *cap)
|
|||||||
|
|
||||||
case 'k':
|
case 'k':
|
||||||
case K_UP:
|
case K_UP:
|
||||||
// with 'nowrap' it works just like the normal "k" command; also when
|
// with 'nowrap' it works just like the normal "k" command.
|
||||||
// in a closed fold
|
if (!curwin->w_p_wrap)
|
||||||
if (!curwin->w_p_wrap
|
|
||||||
#ifdef FEAT_FOLDING
|
|
||||||
|| hasFolding(curwin->w_cursor.lnum, NULL, NULL)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
oap->motion_type = MLINE;
|
oap->motion_type = MLINE;
|
||||||
i = cursor_up(cap->count1, oap->op_type == OP_NOP);
|
i = cursor_up(cap->count1, oap->op_type == OP_NOP);
|
||||||
|
@ -859,4 +859,39 @@ func Test_fold_create_delete()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2385,
|
||||||
/**/
|
/**/
|
||||||
2384,
|
2384,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user