fix(screen): missing search highlights when redrawing from timer #15380

* Revert "vim-patch:8.1.2294: cursor pos wrong with concealing and search causes a scroll"
* Add a test which covers #13074 910bbc3cca
  while reverting the screen.c code changes from there.

Fixes #14064
This commit is contained in:
Jit 2021-09-07 06:18:33 +08:00 committed by GitHub
parent 687a0b3d3e
commit db695cc4ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 37 deletions

View File

@ -765,8 +765,6 @@ static void win_update(win_T *wp, Providers *providers)
long j; long j;
static bool recursive = false; // being called recursively static bool recursive = false; // being called recursively
const linenr_T old_botline = wp->w_botline; const linenr_T old_botline = wp->w_botline;
const int old_wrow = wp->w_wrow;
const int old_wcol = wp->w_wcol;
// Remember what happened to the previous line. // Remember what happened to the previous line.
#define DID_NONE 1 // didn't update a line #define DID_NONE 1 // didn't update a line
#define DID_LINE 2 // updated a normal line #define DID_LINE 2 // updated a normal line
@ -1739,49 +1737,16 @@ static void win_update(win_T *wp, Providers *providers)
wp->w_valid |= VALID_BOTLINE; wp->w_valid |= VALID_BOTLINE;
wp->w_viewport_invalid = true; wp->w_viewport_invalid = true;
if (wp == curwin && wp->w_botline != old_botline && !recursive) { if (wp == curwin && wp->w_botline != old_botline && !recursive) {
const linenr_T old_topline = wp->w_topline;
const int new_wcol = wp->w_wcol;
recursive = true; recursive = true;
curwin->w_valid &= ~VALID_TOPLINE; curwin->w_valid &= ~VALID_TOPLINE;
update_topline(curwin); // may invalidate w_botline again update_topline(curwin); // may invalidate w_botline again
if (must_redraw != 0) {
if (old_wcol != new_wcol
&& (wp->w_valid & (VALID_WCOL|VALID_WROW))
!= (VALID_WCOL|VALID_WROW)) {
// A win_line() call applied a fix to screen cursor column to
// accommodate concealment of cursor line, but in this call to
// update_topline() the cursor's row or column got invalidated.
// If they are left invalid, setcursor() will recompute them
// but there won't be any further win_line() call to re-fix the
// column and the cursor will end up misplaced. So we call
// cursor validation now and reapply the fix again (or call
// win_line() to do it for us).
validate_cursor();
if (wp->w_wcol == old_wcol
&& wp->w_wrow == old_wrow
&& old_topline == wp->w_topline) {
wp->w_wcol = new_wcol;
} else {
redrawWinline(wp, wp->w_cursor.lnum);
}
}
// New redraw either due to updated topline or due to wcol fix.
if (wp->w_redr_type != 0) {
// Don't update for changes in buffer again. // Don't update for changes in buffer again.
i = curbuf->b_mod_set; i = curbuf->b_mod_set;
curbuf->b_mod_set = false; curbuf->b_mod_set = false;
j = curbuf->b_mod_xlines;
curbuf->b_mod_xlines = 0;
win_update(curwin, providers); win_update(curwin, providers);
must_redraw = 0;
curbuf->b_mod_set = i; curbuf->b_mod_set = i;
curbuf->b_mod_xlines = j;
}
// Other windows might have w_redr_type raised in update_topline().
must_redraw = 0;
FOR_ALL_WINDOWS_IN_TAB(wwp, curtab) {
if (wwp->w_redr_type > must_redraw) {
must_redraw = wwp->w_redr_type;
}
} }
recursive = false; recursive = false;
} }

View File

@ -913,4 +913,46 @@ describe('Screen', function()
]]} ]]}
eq(grid_lines, {{2, 0, {{'c', 0, 3}}}}) eq(grid_lines, {{2, 0, {{'c', 0, 3}}}})
end) end)
-- Copy of Test_cursor_column_in_concealed_line_after_window_scroll in
-- test/functional/ui/syntax_conceal_spec.lua.
describe('concealed line after window scroll', function()
after_each(function()
command(':qall!')
os.remove('Xcolesearch')
end)
it('has the correct cursor column', function()
insert([[
3split
let m = matchadd('Conceal', '=')
setl conceallevel=2 concealcursor=nc
normal gg
"==expr==
]])
command('write Xcolesearch')
feed(":so %<CR>")
-- Jump to something that is beyond the bottom of the window,
-- so there's a scroll down.
feed("/expr<CR>")
-- Are the concealed parts of the current line really hidden?
-- Is the window's cursor column properly updated for hidden
-- parts of the current line?
screen:expect{grid=[[
setl conceallevel2 concealcursornc |
normal gg |
"{5:^expr} |
{2:Xcolesearch }|
normal gg |
"=={5:expr}== |
|
{0:~ }|
{3:Xcolesearch }|
/expr |
]]}
end)
end)
end) end)