Skip to content

Commit

Permalink
fix(screen): missing search highlights when redrawing from timer neov…
Browse files Browse the repository at this point in the history
…im#15380

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

Fixes neovim#14064
  • Loading branch information
gelguy committed Sep 6, 2021
1 parent 687a0b3 commit db695cc
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 37 deletions.
39 changes: 2 additions & 37 deletions src/nvim/screen.c
Expand Up @@ -765,8 +765,6 @@ static void win_update(win_T *wp, Providers *providers)
long j;
static bool recursive = false; // being called recursively
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.
#define DID_NONE 1 // didn't update a line
#define DID_LINE 2 // updated a normal line
Expand Down Expand Up @@ -1739,49 +1737,16 @@ static void win_update(win_T *wp, Providers *providers)
wp->w_valid |= VALID_BOTLINE;
wp->w_viewport_invalid = true;
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;
curwin->w_valid &= ~VALID_TOPLINE;
update_topline(curwin); // may invalidate w_botline again

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) {
if (must_redraw != 0) {
// Don't update for changes in buffer again.
i = curbuf->b_mod_set;
curbuf->b_mod_set = false;
j = curbuf->b_mod_xlines;
curbuf->b_mod_xlines = 0;
win_update(curwin, providers);
must_redraw = 0;
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;
}
Expand Down
42 changes: 42 additions & 0 deletions test/functional/ui/syntax_conceal_spec.lua
Expand Up @@ -913,4 +913,46 @@ describe('Screen', function()
]]}
eq(grid_lines, {{2, 0, {{'c', 0, 3}}}})
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)

0 comments on commit db695cc

Please sign in to comment.