commit bdd886622d4d4ae29334248b3e7451c59be0f409
parent 506dd7252a8c70785650640c8db9595f152137ed
Author: zeertzjq <zeertzjq@outlook.com>
Date: Thu, 5 Feb 2026 07:36:57 +0800
vim-patch:9.1.2130: Page scrolling in Insert mode beeps (#37710)
Problem: Page scrolling in Insert mode beeps (after 9.1.0211).
Solution: Fix incorrect return value of pagescroll(). Also invert the
return value of scroll_with_sms() to be less confusing and
match comments (zeertzjq).
fixes: vim/vim#19326
closes: vim/vim#19327
https://github.com/vim/vim/commit/a8ce914db16898de47ff270f3c19e6683012dff8
Diffstat:
2 files changed, 52 insertions(+), 52 deletions(-)
diff --git a/src/nvim/move.c b/src/nvim/move.c
@@ -2454,9 +2454,9 @@ static bool scroll_with_sms(Direction dir, int count, int *curscount)
}
curwin->w_p_sms = prev_sms;
- return curwin->w_topline == prev_topline
- && curwin->w_topfill == prev_topfill
- && curwin->w_skipcol == prev_skipcol;
+ return curwin->w_topline != prev_topline
+ || curwin->w_topfill != prev_topfill
+ || curwin->w_skipcol != prev_skipcol;
}
/// Move screen "count" (half) pages up ("dir" is BACKWARD) or down ("dir" is
@@ -2466,7 +2466,7 @@ static bool scroll_with_sms(Direction dir, int count, int *curscount)
/// @return FAIL for failure, OK otherwise.
int pagescroll(Direction dir, int count, bool half)
{
- int nochange = true;
+ bool did_move = false;
int buflen = curbuf->b_ml.ml_line_count;
colnr_T prev_col = curwin->w_cursor.col;
colnr_T prev_curswant = curwin->w_curswant;
@@ -2498,7 +2498,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, &curscount);
+ did_move = scroll_with_sms(dir, count, &curscount);
curwin->w_cursor.lnum = prev_lnum;
curwin->w_cursor.col = prev_col;
curwin->w_curswant = prev_curswant;
@@ -2517,9 +2517,9 @@ 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, &count);
+ did_move = scroll_with_sms(dir, count, &count);
- if (!nochange) {
+ if (did_move) {
// Place cursor at top or bottom of window.
validate_botline_win(curwin);
linenr_T lnum = (dir == FORWARD ? curwin->w_topline : curwin->w_botline - 1);
@@ -2535,12 +2535,12 @@ int pagescroll(Direction dir, int count, bool half)
// Move cursor to first line of closed fold.
foldAdjustCursor(curwin);
- nochange = nochange
- && prev_col == curwin->w_cursor.col
- && prev_lnum == curwin->w_cursor.lnum;
+ did_move = did_move
+ || prev_col != curwin->w_cursor.col
+ || prev_lnum != curwin->w_cursor.lnum;
// Error if both the viewport and cursor did not change.
- if (nochange) {
+ if (!did_move) {
beep_flush();
} else if (!curwin->w_p_sms) {
beginline(BL_SOL | BL_FIX);
@@ -2548,7 +2548,7 @@ int pagescroll(Direction dir, int count, bool half)
nv_g_home_m_cmd(&ca);
}
- return nochange;
+ return did_move ? OK : FAIL;
}
void do_check_cursorbind(void)
diff --git a/test/old/testdir/test_edit.vim b/test/old/testdir/test_edit.vim
@@ -1374,97 +1374,97 @@ func Test_edit_PAGEUP_PAGEDOWN()
10new
call setline(1, repeat(['abc def ghi'], 30))
call cursor(1, 1)
- call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 9, 1, 0], getpos('.'))
- call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 17, 1, 0], getpos('.'))
- call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 25, 1, 0], getpos('.'))
- call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 30, 1, 0], getpos('.'))
- call feedkeys("i\<PageDown>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("i\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 30, 1, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 29, 1, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 21, 1, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 13, 1, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 10, 1, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 10, 11, 0], getpos('.'))
" <S-Up> is the same as <PageUp>
" <S-Down> is the same as <PageDown>
call cursor(1, 1)
- call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 9, 1, 0], getpos('.'))
- call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 17, 1, 0], getpos('.'))
- call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 25, 1, 0], getpos('.'))
- call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("i\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 30, 1, 0], getpos('.'))
- call feedkeys("i\<S-Down>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("i\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 30, 1, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 29, 1, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 21, 1, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 13, 1, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 10, 1, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 10, 11, 0], getpos('.'))
set nostartofline
call cursor(30, 11)
norm! zt
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 29, 11, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 21, 11, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 13, 11, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 10, 11, 0], getpos('.'))
- call feedkeys("A\<PageUp>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("A\<PageUp>\<esc>", "tnix")')
call assert_equal([0, 10, 11, 0], getpos('.'))
call cursor(1, 1)
- call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 9, 11, 0], getpos('.'))
- call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 17, 11, 0], getpos('.'))
- call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 25, 11, 0], getpos('.'))
- call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 30, 11, 0], getpos('.'))
- call feedkeys("A\<PageDown>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("A\<PageDown>\<esc>", "tnix")')
call assert_equal([0, 30, 11, 0], getpos('.'))
" <S-Up> is the same as <PageUp>
" <S-Down> is the same as <PageDown>
call cursor(30, 11)
norm! zt
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 29, 11, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 21, 11, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 13, 11, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 10, 11, 0], getpos('.'))
- call feedkeys("A\<S-Up>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("A\<S-Up>\<esc>", "tnix")')
call assert_equal([0, 10, 11, 0], getpos('.'))
call cursor(1, 1)
- call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 9, 11, 0], getpos('.'))
- call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 17, 11, 0], getpos('.'))
- call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 25, 11, 0], getpos('.'))
- call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_nobeep('call feedkeys("A\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 30, 11, 0], getpos('.'))
- call feedkeys("A\<S-Down>\<esc>", 'tnix')
+ call assert_beeps('call feedkeys("A\<S-Down>\<esc>", "tnix")')
call assert_equal([0, 30, 11, 0], getpos('.'))
bw!
endfunc