forked from aniani/vim
patch 9.1.0285: Still problems with cursor position for CTRL-D/U
Problem: Problems with cursor position when scrolling half a page. Solution: Rework the cursor logic. (Luuk van Baal) closes: #14455 Signed-off-by: Luuk van Baal <luukvbaal@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
6ce07edd60
commit
78c51500f1
36
src/move.c
36
src/move.c
@@ -3165,7 +3165,6 @@ static int scroll_with_sms(int dir, long count)
|
|||||||
// extra for scrolling backward so that consuming skipcol is symmetric.
|
// extra for scrolling backward so that consuming skipcol is symmetric.
|
||||||
if (labs(curwin->w_topline - prev_topline) > (dir == BACKWARD))
|
if (labs(curwin->w_topline - prev_topline) > (dir == BACKWARD))
|
||||||
fixdir = dir * -1;
|
fixdir = dir * -1;
|
||||||
validate_cursor();
|
|
||||||
while (curwin->w_skipcol > 0
|
while (curwin->w_skipcol > 0
|
||||||
&& curwin->w_topline < curbuf->b_ml.ml_line_count)
|
&& curwin->w_topline < curbuf->b_ml.ml_line_count)
|
||||||
scroll_redraw(fixdir == FORWARD, 1);
|
scroll_redraw(fixdir == FORWARD, 1);
|
||||||
@@ -3192,6 +3191,7 @@ pagescroll(int dir, long count, int half)
|
|||||||
int nochange = TRUE;
|
int nochange = TRUE;
|
||||||
int buflen = curbuf->b_ml.ml_line_count;
|
int buflen = curbuf->b_ml.ml_line_count;
|
||||||
colnr_T prev_col = curwin->w_cursor.col;
|
colnr_T prev_col = curwin->w_cursor.col;
|
||||||
|
colnr_T prev_curswant = curwin->w_curswant;
|
||||||
linenr_T prev_lnum = curwin->w_cursor.lnum;
|
linenr_T prev_lnum = curwin->w_cursor.lnum;
|
||||||
oparg_T oa = { 0 };
|
oparg_T oa = { 0 };
|
||||||
cmdarg_T ca = { 0 };
|
cmdarg_T ca = { 0 };
|
||||||
@@ -3215,34 +3215,24 @@ pagescroll(int dir, long count, int half)
|
|||||||
count = n - curwin->w_height;
|
count = n - curwin->w_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scroll the window and determine number of lines to move the cursor.
|
// (Try to) scroll the window unless already at the end of the buffer.
|
||||||
if (count > 0)
|
if (count > 0)
|
||||||
{
|
{
|
||||||
validate_cursor();
|
|
||||||
int prev_wrow = curwin->w_wrow;
|
|
||||||
nochange = scroll_with_sms(dir, count);
|
nochange = scroll_with_sms(dir, count);
|
||||||
if (!nochange)
|
curwin->w_cursor.lnum = prev_lnum;
|
||||||
{
|
curwin->w_cursor.col = prev_col;
|
||||||
validate_cursor();
|
curwin->w_curswant = prev_curswant;
|
||||||
curscount = abs(prev_wrow - curwin->w_wrow);
|
|
||||||
dir = prev_wrow > curwin->w_wrow ? FORWARD : BACKWARD;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int so = get_scrolloff_value();
|
// Move the cursor the same amount of screen lines.
|
||||||
// Move the cursor the same amount of screen lines except if
|
if (curwin->w_p_wrap)
|
||||||
// 'scrolloff' is set and cursor was at start or end of buffer.
|
nv_screengo(&oa, dir, curscount);
|
||||||
if (so == 0 || (prev_lnum != 1 && prev_lnum != buflen))
|
else if (dir == FORWARD)
|
||||||
{
|
cursor_down_inner(curwin, curscount);
|
||||||
if (curwin->w_p_wrap)
|
else
|
||||||
nv_screengo(&oa, dir, curscount);
|
cursor_up_inner(curwin, curscount);
|
||||||
else if (dir == FORWARD)
|
|
||||||
cursor_down_inner(curwin, curscount);
|
|
||||||
else
|
|
||||||
cursor_up_inner(curwin, curscount);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (so > 0)
|
if (get_scrolloff_value() > 0)
|
||||||
cursor_correct();
|
cursor_correct();
|
||||||
#ifdef FEAT_FOLDING
|
#ifdef FEAT_FOLDING
|
||||||
// Move cursor to first line of closed fold.
|
// Move cursor to first line of closed fold.
|
||||||
|
@@ -4225,4 +4225,16 @@ func Test_single_line_filler_zb()
|
|||||||
bw!
|
bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Test for Ctrl-U not getting stuck at end of buffer with 'scrolloff'.
|
||||||
|
func Test_halfpage_scrolloff_eob()
|
||||||
|
set scrolloff=5
|
||||||
|
|
||||||
|
call setline(1, range(1, 100))
|
||||||
|
exe "norm! Gzz\<C-U>zz"
|
||||||
|
call assert_notequal(100, line('.'))
|
||||||
|
|
||||||
|
set scrolloff&
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab nofoldenable
|
" vim: shiftwidth=2 sts=2 expandtab nofoldenable
|
||||||
|
@@ -1028,10 +1028,10 @@ func Test_smoothscroll_page()
|
|||||||
call assert_equal(415, col('.'))
|
call assert_equal(415, col('.'))
|
||||||
exe "norm! \<C-D>"
|
exe "norm! \<C-D>"
|
||||||
call assert_equal(520, winsaveview().skipcol)
|
call assert_equal(520, winsaveview().skipcol)
|
||||||
call assert_equal(535, col('.'))
|
call assert_equal(615, col('.'))
|
||||||
exe "norm! \<C-D>"
|
exe "norm! \<C-D>"
|
||||||
call assert_equal(520, winsaveview().skipcol)
|
call assert_equal(520, winsaveview().skipcol)
|
||||||
call assert_equal(735, col('.'))
|
call assert_equal(815, col('.'))
|
||||||
exe "norm! \<C-D>"
|
exe "norm! \<C-D>"
|
||||||
call assert_equal(520, winsaveview().skipcol)
|
call assert_equal(520, winsaveview().skipcol)
|
||||||
call assert_equal(895, col('.'))
|
call assert_equal(895, col('.'))
|
||||||
@@ -1043,10 +1043,10 @@ func Test_smoothscroll_page()
|
|||||||
call assert_equal(495, col('.'))
|
call assert_equal(495, col('.'))
|
||||||
exe "norm! \<C-U>"
|
exe "norm! \<C-U>"
|
||||||
call assert_equal(0, winsaveview().skipcol)
|
call assert_equal(0, winsaveview().skipcol)
|
||||||
call assert_equal(375, col('.'))
|
call assert_equal(295, col('.'))
|
||||||
exe "norm! \<C-U>"
|
exe "norm! \<C-U>"
|
||||||
call assert_equal(0, winsaveview().skipcol)
|
call assert_equal(0, winsaveview().skipcol)
|
||||||
call assert_equal(175, col('.'))
|
call assert_equal(95, col('.'))
|
||||||
exe "norm! \<C-U>"
|
exe "norm! \<C-U>"
|
||||||
call assert_equal(0, winsaveview().skipcol)
|
call assert_equal(0, winsaveview().skipcol)
|
||||||
call assert_equal(15, col('.'))
|
call assert_equal(15, col('.'))
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
285,
|
||||||
/**/
|
/**/
|
||||||
284,
|
284,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user