mirror of
https://github.com/neovim/neovim.git
synced 2025-09-07 03:48:18 +00:00
fix(terminal): add various missing redraws
Problem: missing redraws when restoring saved cursorline/column, plus missing statusline and mode redraws when not updating the screen in terminal mode. Solution: schedule the redraws in a similar manner to other modes and remove some now unnecessary redrawing logic. Redraw if cursorline-related options change from entering terminal mode. This fixes test failures in later commits. WTF: TextChangedT triggers based on must_redraw, which is... fun...? Try to preserve its behaviour as much as we can for now.
This commit is contained in:
@@ -705,18 +705,19 @@ bool terminal_enter(void)
|
|||||||
} else {
|
} else {
|
||||||
curwin->w_p_cul = false;
|
curwin->w_p_cul = false;
|
||||||
}
|
}
|
||||||
if (curwin->w_p_cuc) {
|
|
||||||
redraw_later(curwin, UPD_SOME_VALID);
|
|
||||||
}
|
|
||||||
curwin->w_p_cuc = false;
|
curwin->w_p_cuc = false;
|
||||||
curwin->w_p_so = 0;
|
curwin->w_p_so = 0;
|
||||||
curwin->w_p_siso = 0;
|
curwin->w_p_siso = 0;
|
||||||
|
if (curwin->w_p_cuc != save_w_p_cuc) {
|
||||||
|
redraw_later(curwin, UPD_SOME_VALID);
|
||||||
|
} else if (curwin->w_p_cul != save_w_p_cul
|
||||||
|
|| (curwin->w_p_cul && curwin->w_p_culopt_flags != save_w_p_culopt_flags)) {
|
||||||
|
redraw_later(curwin, UPD_VALID);
|
||||||
|
}
|
||||||
|
|
||||||
s->term->pending.cursor = true; // Update the cursor shape table
|
s->term->pending.cursor = true; // Update the cursor shape table
|
||||||
adjust_topline(s->term, buf, 0); // scroll to end
|
adjust_topline(s->term, buf, 0); // scroll to end
|
||||||
showmode();
|
showmode();
|
||||||
curwin->w_redr_status = true; // For mode() in statusline. #8323
|
|
||||||
redraw_custom_title_later();
|
|
||||||
ui_cursor_shape();
|
ui_cursor_shape();
|
||||||
apply_autocmds(EVENT_TERMENTER, NULL, NULL, false, curbuf);
|
apply_autocmds(EVENT_TERMENTER, NULL, NULL, false, curbuf);
|
||||||
may_trigger_modechanged();
|
may_trigger_modechanged();
|
||||||
@@ -744,6 +745,12 @@ bool terminal_enter(void)
|
|||||||
(void)parse_shape_opt(SHAPE_CURSOR);
|
(void)parse_shape_opt(SHAPE_CURSOR);
|
||||||
|
|
||||||
if (save_curwin == curwin->handle) { // Else: window was closed.
|
if (save_curwin == curwin->handle) { // Else: window was closed.
|
||||||
|
if (save_w_p_cuc != curwin->w_p_cuc) {
|
||||||
|
redraw_later(curwin, UPD_SOME_VALID);
|
||||||
|
} else if (save_w_p_cul != curwin->w_p_cul
|
||||||
|
|| (save_w_p_cul && save_w_p_culopt_flags != curwin->w_p_culopt_flags)) {
|
||||||
|
redraw_later(curwin, UPD_VALID);
|
||||||
|
}
|
||||||
curwin->w_p_cul = save_w_p_cul;
|
curwin->w_p_cul = save_w_p_cul;
|
||||||
if (save_w_p_culopt) {
|
if (save_w_p_culopt) {
|
||||||
free_string_option(curwin->w_p_culopt);
|
free_string_option(curwin->w_p_culopt);
|
||||||
@@ -808,10 +815,18 @@ static int terminal_check(VimState *state)
|
|||||||
assert(s->term == curbuf->terminal);
|
assert(s->term == curbuf->terminal);
|
||||||
terminal_check_cursor();
|
terminal_check_cursor();
|
||||||
validate_cursor(curwin);
|
validate_cursor(curwin);
|
||||||
|
const bool text_changed = must_redraw != 0;
|
||||||
|
show_cursor_info_later(false);
|
||||||
|
|
||||||
if (must_redraw) {
|
if (must_redraw) {
|
||||||
update_screen();
|
update_screen();
|
||||||
|
} else {
|
||||||
|
redraw_statuslines();
|
||||||
|
if (clear_cmdline || redraw_cmdline || redraw_mode) {
|
||||||
|
showmode(); // clear cmdline and show mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (text_changed) {
|
||||||
// Make sure an invoked autocmd doesn't delete the buffer (and the
|
// Make sure an invoked autocmd doesn't delete the buffer (and the
|
||||||
// terminal) under our fingers.
|
// terminal) under our fingers.
|
||||||
curbuf->b_locked++;
|
curbuf->b_locked++;
|
||||||
@@ -827,10 +842,6 @@ static int terminal_check(VimState *state)
|
|||||||
|
|
||||||
may_trigger_win_scrolled_resized();
|
may_trigger_win_scrolled_resized();
|
||||||
|
|
||||||
if (need_maketitle) { // Update title in terminal-mode. #7248
|
|
||||||
maketitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
setcursor();
|
setcursor();
|
||||||
refresh_cursor(s->term, &s->cursor_visible);
|
refresh_cursor(s->term, &s->cursor_visible);
|
||||||
ui_flush();
|
ui_flush();
|
||||||
|
@@ -189,6 +189,149 @@ describe(':terminal window', function()
|
|||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('redrawn when restoring cursorline/column', function()
|
||||||
|
screen:set_default_attr_ids({
|
||||||
|
[1] = { bold = true },
|
||||||
|
[2] = { foreground = 130 },
|
||||||
|
[3] = { foreground = 130, underline = true },
|
||||||
|
[12] = { underline = true },
|
||||||
|
[19] = { background = 7 },
|
||||||
|
})
|
||||||
|
|
||||||
|
feed([[<C-\><C-N>]])
|
||||||
|
command('setlocal cursorline')
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
{12:^ }|
|
||||||
|
|*5
|
||||||
|
]])
|
||||||
|
feed('i')
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
^ |
|
||||||
|
|*4
|
||||||
|
{1:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
feed([[<C-\><C-N>]])
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
{12:^ }|
|
||||||
|
|*5
|
||||||
|
]])
|
||||||
|
|
||||||
|
command('setlocal number')
|
||||||
|
screen:expect([[
|
||||||
|
{2: 1 }tty ready |
|
||||||
|
{3: 2 }{12:^rows: 6, cols: 46 }|
|
||||||
|
{2: 3 } |
|
||||||
|
{2: 4 } |
|
||||||
|
{2: 5 } |
|
||||||
|
{2: 6 } |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('i')
|
||||||
|
screen:expect([[
|
||||||
|
{2: 1 }tty ready |
|
||||||
|
{2: 2 }rows: 6, cols: 46 |
|
||||||
|
{3: 3 }^ |
|
||||||
|
{2: 4 } |
|
||||||
|
{2: 5 } |
|
||||||
|
{2: 6 } |
|
||||||
|
{1:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
feed([[<C-\><C-N>]])
|
||||||
|
screen:expect([[
|
||||||
|
{2: 1 }tty ready |
|
||||||
|
{2: 2 }rows: 6, cols: 46 |
|
||||||
|
{3: 3 }{12:^ }|
|
||||||
|
{2: 4 } |
|
||||||
|
{2: 5 } |
|
||||||
|
{2: 6 } |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
command('setlocal nonumber nocursorline cursorcolumn')
|
||||||
|
screen:expect([[
|
||||||
|
{19:t}ty ready |
|
||||||
|
{19:r}ows: 6, cols: 46 |
|
||||||
|
^rows: 6, cols: 50 |
|
||||||
|
{19: } |*3
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('i')
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
rows: 6, cols: 46 |
|
||||||
|
rows: 6, cols: 50 |
|
||||||
|
^ |
|
||||||
|
|*2
|
||||||
|
{1:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
feed([[<C-\><C-N>]])
|
||||||
|
screen:expect([[
|
||||||
|
{19:t}ty ready |
|
||||||
|
{19:r}ows: 6, cols: 46 |
|
||||||
|
{19:r}ows: 6, cols: 50 |
|
||||||
|
^ |
|
||||||
|
{19: } |*2
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('redraws cursor info in terminal mode', function()
|
||||||
|
skip(is_os('win'), '#31587')
|
||||||
|
command('file AMOGUS | set laststatus=2 ruler')
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
rows: 5, cols: 50 |
|
||||||
|
^ |
|
||||||
|
|*2
|
||||||
|
{120:AMOGUS [-] 3,0-1 All}|
|
||||||
|
{5:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
feed_data('you are the imposter')
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
rows: 5, cols: 50 |
|
||||||
|
you are the imposter^ |
|
||||||
|
|*2
|
||||||
|
{120:AMOGUS [-] 3,21 All}|
|
||||||
|
{5:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
feed([[<C-\><C-N>]])
|
||||||
|
screen:expect([[
|
||||||
|
tty ready |
|
||||||
|
rows: 5, cols: 50 |
|
||||||
|
you are the imposte^r |
|
||||||
|
|*2
|
||||||
|
{120:AMOGUS [-] 3,20 All}|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('redraws stale statuslines and mode when not updating screen', function()
|
||||||
|
command('file foo | set ruler | vsplit')
|
||||||
|
screen:expect([[
|
||||||
|
tty ready │tty ready |
|
||||||
|
rows: 5, cols: 25 │rows: 5, cols: 25 |
|
||||||
|
^ │ |
|
||||||
|
│ |*2
|
||||||
|
{120:<o [-] 3,0-1 All }{119:< [-] 2,0-1 Top}|
|
||||||
|
{5:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
command("call win_execute(win_getid(winnr('#')), 'call cursor(1, 1)')")
|
||||||
|
screen:expect([[
|
||||||
|
tty ready │tty ready |
|
||||||
|
rows: 5, cols: 25 │rows: 5, cols: 25 |
|
||||||
|
^ │ |
|
||||||
|
│ |*2
|
||||||
|
{120:<o [-] 3,0-1 All }{119:< [-] 1,1 All}|
|
||||||
|
{5:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
command('echo ""')
|
||||||
|
screen:expect_unchanged()
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe(':terminal with multigrid', function()
|
describe(':terminal with multigrid', function()
|
||||||
|
@@ -79,18 +79,27 @@ describe('title', function()
|
|||||||
|
|
||||||
it('is updated in Terminal mode', function()
|
it('is updated in Terminal mode', function()
|
||||||
api.nvim_set_option_value('title', true, {})
|
api.nvim_set_option_value('title', true, {})
|
||||||
api.nvim_set_option_value('titlestring', '(%{mode(1)}) | nvim', {})
|
api.nvim_set_option_value('titlestring', '%t (%{mode(1)}) | nvim', {})
|
||||||
fn.jobstart({ n.testprg('shell-test'), 'INTERACT' }, { term = true })
|
fn.jobstart({ n.testprg('shell-test'), 'INTERACT' }, { term = true })
|
||||||
|
api.nvim_buf_set_name(0, 'shell-test')
|
||||||
screen:expect(function()
|
screen:expect(function()
|
||||||
eq('(nt) | nvim', screen.title)
|
eq('shell-test (nt) | nvim', screen.title)
|
||||||
end)
|
end)
|
||||||
feed('i')
|
feed('i')
|
||||||
screen:expect(function()
|
screen:expect(function()
|
||||||
eq('(t) | nvim', screen.title)
|
eq('shell-test (t) | nvim', screen.title)
|
||||||
|
end)
|
||||||
|
api.nvim_set_option_value('titlelen', 1, {})
|
||||||
|
screen:expect(function()
|
||||||
|
eq('<t) | nvim', screen.title)
|
||||||
|
end)
|
||||||
|
command('set titlelen&')
|
||||||
|
screen:expect(function()
|
||||||
|
eq('shell-test (t) | nvim', screen.title)
|
||||||
end)
|
end)
|
||||||
feed([[<C-\><C-N>]])
|
feed([[<C-\><C-N>]])
|
||||||
screen:expect(function()
|
screen:expect(function()
|
||||||
eq('(nt) | nvim', screen.title)
|
eq('shell-test (nt) | nvim', screen.title)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user