mirror of
https://github.com/neovim/neovim.git
synced 2024-12-23 20:55:18 -07:00
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:
parent
687a0b3d3e
commit
db695cc4ca
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user