aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorluukvbaal <luukvbaal@gmail.com>2024-05-11 12:17:57 +0200
committerGitHub <noreply@github.com>2024-05-11 18:17:57 +0800
commite1a81c8d8bbbe67710980f0e81aa9473e37defee (patch)
tree435e6a1647fe0cd339b16e43caac0ec2410f6b34 /src
parent7a03cd1dba0eeac361a518ee5d92ff81405c3690 (diff)
downloadrneovim-e1a81c8d8bbbe67710980f0e81aa9473e37defee.tar.gz
rneovim-e1a81c8d8bbbe67710980f0e81aa9473e37defee.tar.bz2
rneovim-e1a81c8d8bbbe67710980f0e81aa9473e37defee.zip
vim-patch:9.1.0407: Stuck with long line and half-page scrolling (#28704)
Problem: No scrolling happens with half-page scrolling with line filling entire window when 'smoothscroll' is disabled. (Mathias Rav, after v9.1.0285) Solution: Adjust amount to move cursor by so that it is moved the same number of lines as was scrolled, even when scrolling different number of lines than requested with 'nosmoothscroll'. https://github.com/vim/vim/commit/58448e09be497a8abb595ae309b6edfbc8e0e05a
Diffstat (limited to 'src')
-rw-r--r--src/nvim/move.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/nvim/move.c b/src/nvim/move.c
index 66667cecc4..b07bc33b17 100644
--- a/src/nvim/move.c
+++ b/src/nvim/move.c
@@ -2412,8 +2412,10 @@ static int get_scroll_overlap(Direction dir)
}
}
-/// Scroll "count" lines with 'smoothscroll' in direction "dir".
-static bool scroll_with_sms(Direction dir, int count)
+/// Scroll "count" lines with 'smoothscroll' in direction "dir". Return true
+/// when scrolling happened. Adjust "curscount" for scrolling different amount
+/// of lines when 'smoothscroll' is disabled.
+static bool scroll_with_sms(Direction dir, int count, int *curscount)
{
int prev_sms = curwin->w_p_sms;
colnr_T prev_skipcol = curwin->w_skipcol;
@@ -2435,6 +2437,7 @@ static bool scroll_with_sms(Direction dir, int count)
while (curwin->w_skipcol > 0
&& curwin->w_topline < curbuf->b_ml.ml_line_count) {
scroll_redraw(fixdir == FORWARD, 1);
+ *curscount += (fixdir == dir ? 1 : -1);
}
}
curwin->w_p_sms = prev_sms;
@@ -2482,7 +2485,7 @@ int pagescroll(Direction dir, int count, bool half)
// (Try to) scroll the window unless already at the end of the buffer.
if (count > 0) {
- nochange = scroll_with_sms(dir, count);
+ nochange = scroll_with_sms(dir, count, &curscount);
curwin->w_cursor.lnum = prev_lnum;
curwin->w_cursor.col = prev_col;
curwin->w_curswant = prev_curswant;
@@ -2500,7 +2503,7 @@ int pagescroll(Direction dir, int count, bool half)
// Scroll [count] times 'window' or current window height lines.
count *= ((ONE_WINDOW && p_window > 0 && p_window < Rows - 1)
? MAX(1, (int)p_window - 2) : get_scroll_overlap(dir));
- nochange = scroll_with_sms(dir, count);
+ nochange = scroll_with_sms(dir, count, &count);
// Place cursor at top or bottom of window.
validate_botline(curwin);