diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2024-04-09 21:41:54 +0200 |
---|---|---|
committer | Luuk van Baal <luukvbaal@gmail.com> | 2024-04-09 21:44:42 +0200 |
commit | 832857ae094743bd17e36a0096d1da38fc383178 (patch) | |
tree | 5f64f95e49f0cfa6f0502739a945c702454ec9b3 /src | |
parent | 4946489e2e3eeca5c831faf9fe86cbf1229701e2 (diff) | |
download | rneovim-832857ae094743bd17e36a0096d1da38fc383178.tar.gz rneovim-832857ae094743bd17e36a0096d1da38fc383178.tar.bz2 rneovim-832857ae094743bd17e36a0096d1da38fc383178.zip |
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)
https://github.com/vim/vim/commit/78c51500f1bb16501521d721d52cb0982f5e70b6
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/move.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/src/nvim/move.c b/src/nvim/move.c index 675f048d09..f3a79c08bf 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -2424,7 +2424,6 @@ static bool scroll_with_sms(Direction dir, int count) if (labs(curwin->w_topline - prev_topline) > (dir == BACKWARD)) { fixdir = dir * -1; } - validate_cursor(curwin); while (curwin->w_skipcol > 0 && curwin->w_topline < curbuf->b_ml.ml_line_count) { scroll_redraw(fixdir == FORWARD, 1); @@ -2447,6 +2446,7 @@ int pagescroll(Direction dir, int count, bool half) int nochange = true; int buflen = curbuf->b_ml.ml_line_count; colnr_T prev_col = curwin->w_cursor.col; + colnr_T prev_curswant = curwin->w_curswant; linenr_T prev_lnum = curwin->w_cursor.lnum; oparg_T oa = { 0 }; cmdarg_T ca = { 0 }; @@ -2471,32 +2471,24 @@ int pagescroll(Direction dir, int count, bool half) } } - // 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) { - validate_cursor(curwin); - int prev_wrow = curwin->w_wrow; nochange = scroll_with_sms(dir, count); - if (!nochange) { - validate_cursor(curwin); - curscount = abs(prev_wrow - curwin->w_wrow); - dir = prev_wrow > curwin->w_wrow ? FORWARD : BACKWARD; - } + curwin->w_cursor.lnum = prev_lnum; + curwin->w_cursor.col = prev_col; + curwin->w_curswant = prev_curswant; } - int so = get_scrolloff_value(curwin); - // Move the cursor the same amount of screen lines except if - // 'scrolloff' is set and cursor was at start or end of buffer. - if (so == 0 || (prev_lnum != 1 && prev_lnum != buflen)) { - if (curwin->w_p_wrap) { - nv_screengo(&oa, dir, curscount); - } else if (dir == FORWARD) { - cursor_down_inner(curwin, curscount); - } else { - cursor_up_inner(curwin, curscount); - } + // Move the cursor the same amount of screen lines. + if (curwin->w_p_wrap) { + nv_screengo(&oa, dir, curscount); + } else if (dir == FORWARD) { + cursor_down_inner(curwin, curscount); + } else { + cursor_up_inner(curwin, curscount); } - if (so > 0) { + if (get_scrolloff_value(curwin) > 0) { cursor_correct(curwin); } // Move cursor to first line of closed fold. |