mirror of
https://github.com/neovim/neovim.git
synced 2026-04-23 15:55:36 +00:00
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
a8ce914db1
(cherry picked from commit bdd886622d)
This commit is contained in:
committed by
github-actions[bot]
parent
5f6b195402
commit
79ed49cc69
@@ -2445,9 +2445,9 @@ static bool scroll_with_sms(Direction dir, int count, int *curscount)
|
|||||||
}
|
}
|
||||||
curwin->w_p_sms = prev_sms;
|
curwin->w_p_sms = prev_sms;
|
||||||
|
|
||||||
return curwin->w_topline == prev_topline
|
return curwin->w_topline != prev_topline
|
||||||
&& curwin->w_topfill == prev_topfill
|
|| curwin->w_topfill != prev_topfill
|
||||||
&& curwin->w_skipcol == prev_skipcol;
|
|| curwin->w_skipcol != prev_skipcol;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Move screen "count" (half) pages up ("dir" is BACKWARD) or down ("dir" is
|
/// Move screen "count" (half) pages up ("dir" is BACKWARD) or down ("dir" is
|
||||||
@@ -2457,7 +2457,7 @@ static bool scroll_with_sms(Direction dir, int count, int *curscount)
|
|||||||
/// @return FAIL for failure, OK otherwise.
|
/// @return FAIL for failure, OK otherwise.
|
||||||
int pagescroll(Direction dir, int count, bool half)
|
int pagescroll(Direction dir, int count, bool half)
|
||||||
{
|
{
|
||||||
int nochange = true;
|
bool did_move = false;
|
||||||
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;
|
colnr_T prev_curswant = curwin->w_curswant;
|
||||||
@@ -2489,7 +2489,7 @@ int pagescroll(Direction dir, int count, bool half)
|
|||||||
|
|
||||||
// (Try to) scroll the window unless already at the end of the buffer.
|
// (Try to) scroll the window unless already at the end of the buffer.
|
||||||
if (count > 0) {
|
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.lnum = prev_lnum;
|
||||||
curwin->w_cursor.col = prev_col;
|
curwin->w_cursor.col = prev_col;
|
||||||
curwin->w_curswant = prev_curswant;
|
curwin->w_curswant = prev_curswant;
|
||||||
@@ -2508,9 +2508,9 @@ int pagescroll(Direction dir, int count, bool half)
|
|||||||
// Scroll [count] times 'window' or current window height lines.
|
// Scroll [count] times 'window' or current window height lines.
|
||||||
count *= ((ONE_WINDOW && p_window > 0 && p_window < Rows - 1)
|
count *= ((ONE_WINDOW && p_window > 0 && p_window < Rows - 1)
|
||||||
? MAX(1, (int)p_window - 2) : get_scroll_overlap(dir));
|
? 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.
|
// Place cursor at top or bottom of window.
|
||||||
validate_botline(curwin);
|
validate_botline(curwin);
|
||||||
linenr_T lnum = (dir == FORWARD ? curwin->w_topline : curwin->w_botline - 1);
|
linenr_T lnum = (dir == FORWARD ? curwin->w_topline : curwin->w_botline - 1);
|
||||||
@@ -2526,12 +2526,12 @@ int pagescroll(Direction dir, int count, bool half)
|
|||||||
// Move cursor to first line of closed fold.
|
// Move cursor to first line of closed fold.
|
||||||
foldAdjustCursor(curwin);
|
foldAdjustCursor(curwin);
|
||||||
|
|
||||||
nochange = nochange
|
did_move = did_move
|
||||||
&& prev_col == curwin->w_cursor.col
|
|| prev_col != curwin->w_cursor.col
|
||||||
&& prev_lnum == curwin->w_cursor.lnum;
|
|| prev_lnum != curwin->w_cursor.lnum;
|
||||||
|
|
||||||
// Error if both the viewport and cursor did not change.
|
// Error if both the viewport and cursor did not change.
|
||||||
if (nochange) {
|
if (!did_move) {
|
||||||
beep_flush();
|
beep_flush();
|
||||||
} else if (!curwin->w_p_sms) {
|
} else if (!curwin->w_p_sms) {
|
||||||
beginline(BL_SOL | BL_FIX);
|
beginline(BL_SOL | BL_FIX);
|
||||||
@@ -2539,7 +2539,7 @@ int pagescroll(Direction dir, int count, bool half)
|
|||||||
nv_g_home_m_cmd(&ca);
|
nv_g_home_m_cmd(&ca);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nochange;
|
return did_move ? OK : FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_check_cursorbind(void)
|
void do_check_cursorbind(void)
|
||||||
|
|||||||
@@ -1347,97 +1347,97 @@ func Test_edit_PAGEUP_PAGEDOWN()
|
|||||||
10new
|
10new
|
||||||
call setline(1, repeat(['abc def ghi'], 30))
|
call setline(1, repeat(['abc def ghi'], 30))
|
||||||
call cursor(1, 1)
|
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 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 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 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 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 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 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 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 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 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('.'))
|
call assert_equal([0, 10, 11, 0], getpos('.'))
|
||||||
" <S-Up> is the same as <PageUp>
|
" <S-Up> is the same as <PageUp>
|
||||||
" <S-Down> is the same as <PageDown>
|
" <S-Down> is the same as <PageDown>
|
||||||
call cursor(1, 1)
|
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 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 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 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 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 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 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 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 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 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('.'))
|
call assert_equal([0, 10, 11, 0], getpos('.'))
|
||||||
set nostartofline
|
set nostartofline
|
||||||
call cursor(30, 11)
|
call cursor(30, 11)
|
||||||
norm! zt
|
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 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 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 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 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 assert_equal([0, 10, 11, 0], getpos('.'))
|
||||||
call cursor(1, 1)
|
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 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 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 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 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('.'))
|
call assert_equal([0, 30, 11, 0], getpos('.'))
|
||||||
" <S-Up> is the same as <PageUp>
|
" <S-Up> is the same as <PageUp>
|
||||||
" <S-Down> is the same as <PageDown>
|
" <S-Down> is the same as <PageDown>
|
||||||
call cursor(30, 11)
|
call cursor(30, 11)
|
||||||
norm! zt
|
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 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 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 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 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 assert_equal([0, 10, 11, 0], getpos('.'))
|
||||||
call cursor(1, 1)
|
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 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 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 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 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('.'))
|
call assert_equal([0, 30, 11, 0], getpos('.'))
|
||||||
bw!
|
bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|||||||
Reference in New Issue
Block a user