feat(term): enable reflow by default (#21124)

Problem: Contents of terminal buffer are not reflown when Nvim is
resized.

Solution: Enable reflow in libvterm by default. Now that libvterm is
vendored, also fix "TUI rapid resize" test failures there.

Note: Neovim's scrollback buffer does not support reflow (yet), so lines
vanishing into the buffer due to a too small window will be restored
without reflow.
This commit is contained in:
Christian Clason 2023-05-24 10:04:49 +02:00
parent fa79a8ad6d
commit 8df6736ca1
7 changed files with 19 additions and 8 deletions

View File

@ -163,6 +163,9 @@ TERMINAL
system clipboard (copy). Querying with OSC 52 (paste) is not supported. system clipboard (copy). Querying with OSC 52 (paste) is not supported.
• |hl-StatusLineTerm| and |hl-StatusLineTermNC| define highlights for the • |hl-StatusLineTerm| and |hl-StatusLineTermNC| define highlights for the
status line in |terminal| windows. status line in |terminal| windows.
• The terminal buffer now supports reflow (wrapped lines adapt when the buffer
is resized horizontally). Note: Lines that are not visible and kept in
'scrollback' are not reflown.
TREESITTER TREESITTER

View File

@ -5031,6 +5031,9 @@ A jump table for the options with a short description can be found at |Q_op|.
Minimum is 1, maximum is 100000. Minimum is 1, maximum is 100000.
Only in |terminal| buffers. Only in |terminal| buffers.
Note: Lines that are not visible and kept in scrollback are not
reflown when the terminal buffer is resized horizontally.
*'scrollbind'* *'scb'* *'noscrollbind'* *'noscb'* *'scrollbind'* *'scb'* *'noscrollbind'* *'noscb'*
'scrollbind' 'scb' boolean (default off) 'scrollbind' 'scb' boolean (default off)
local to window local to window

View File

@ -5253,6 +5253,9 @@ vim.wo.scr = vim.wo.scroll
--- Minimum is 1, maximum is 100000. --- Minimum is 1, maximum is 100000.
--- Only in `terminal` buffers. --- Only in `terminal` buffers.
--- ---
--- Note: Lines that are not visible and kept in scrollback are not
--- reflown when the terminal buffer is resized horizontally.
---
--- @type integer --- @type integer
vim.o.scrollback = -1 vim.o.scrollback = -1
vim.o.scbk = vim.o.scrollback vim.o.scbk = vim.o.scrollback

View File

@ -6627,6 +6627,9 @@ return {
top are deleted if new lines exceed this limit. top are deleted if new lines exceed this limit.
Minimum is 1, maximum is 100000. Minimum is 1, maximum is 100000.
Only in |terminal| buffers. Only in |terminal| buffers.
Note: Lines that are not visible and kept in scrollback are not
reflown when the terminal buffer is resized horizontally.
]=], ]=],
full_name = 'scrollback', full_name = 'scrollback',
redraw = { 'current_buffer' }, redraw = { 'current_buffer' },

View File

@ -319,8 +319,7 @@ void terminal_open(Terminal **termpp, buf_T *buf, TerminalOptions opts)
// Set up screen // Set up screen
term->vts = vterm_obtain_screen(term->vt); term->vts = vterm_obtain_screen(term->vt);
vterm_screen_enable_altscreen(term->vts, true); vterm_screen_enable_altscreen(term->vts, true);
// TODO(clason): reenable when https://github.com/neovim/neovim/issues/23762 is fixed vterm_screen_enable_reflow(term->vts, true);
// vterm_screen_enable_reflow(term->vts, true);
// delete empty lines at the end of the buffer // delete empty lines at the end of the buffer
vterm_screen_set_callbacks(term->vts, &vterm_screen_callbacks, term); vterm_screen_set_callbacks(term->vts, &vterm_screen_callbacks, term);
vterm_screen_set_unrecognised_fallbacks(term->vts, &vterm_fallbacks, term); vterm_screen_set_unrecognised_fallbacks(term->vts, &vterm_fallbacks, term);

View File

@ -534,7 +534,7 @@ static void resize_buffer(VTermScreen *screen, int bufidx, int new_rows, int new
while(old_row >= 0) { while(old_row >= 0) {
int old_row_end = old_row; int old_row_end = old_row;
/* TODO: Stop if dwl or dhl */ /* TODO: Stop if dwl or dhl */
while(REFLOW && old_lineinfo && old_row >= 0 && old_lineinfo[old_row].continuation) while(REFLOW && old_lineinfo && old_row > 0 && old_lineinfo[old_row].continuation)
old_row--; old_row--;
int old_row_start = old_row; int old_row_start = old_row;
@ -596,7 +596,7 @@ static void resize_buffer(VTermScreen *screen, int bufidx, int new_rows, int new
#endif #endif
if(new_row_start < 0) { if(new_row_start < 0) {
if(old_row_start <= old_cursor.row && old_cursor.row < old_row_end) { if(old_row_start <= old_cursor.row && old_cursor.row <= old_row_end) {
new_cursor.row = 0; new_cursor.row = 0;
new_cursor.col = old_cursor.col; new_cursor.col = old_cursor.col;
if(new_cursor.col >= new_cols) if(new_cursor.col >= new_cols)

View File

@ -87,7 +87,7 @@ describe(':terminal window', function()
{7: 1 }tty ready | {7: 1 }tty ready |
{7: 2 }rows: 6, cols: 48 | {7: 2 }rows: 6, cols: 48 |
{7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO| {7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO|
{7: 4 }WXYZrows: 6, cols: 41 | {7: 4 }PQRSTUVWXYZrows: 6, cols: 41 |
{7: 5 }{1: } | {7: 5 }{1: } |
{7: 6 } | {7: 6 } |
{3:-- TERMINAL --} | {3:-- TERMINAL --} |
@ -97,7 +97,7 @@ describe(':terminal window', function()
{7: 1 }tty ready | {7: 1 }tty ready |
{7: 2 }rows: 6, cols: 48 | {7: 2 }rows: 6, cols: 48 |
{7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO| {7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO|
{7: 4 }WXYZrows: 6, cols: 41 | {7: 4 }PQRSTUVWXYZrows: 6, cols: 41 |
{7: 5 } abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN| {7: 5 } abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN|
{7: 6 }OPQRSTUVWXYZ{1: } | {7: 6 }OPQRSTUVWXYZ{1: } |
{3:-- TERMINAL --} | {3:-- TERMINAL --} |
@ -132,9 +132,9 @@ describe(':terminal window', function()
screen:expect([[ screen:expect([[
{7:++ 7 } | {7:++ 7 } |
{7:++ 8 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR| {7:++ 8 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR|
{7:++ 9 }TUVWXYZ | {7:++ 9 }STUVWXYZ |
{7:++10 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR| {7:++10 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR|
{7:++11 }TUVWXYZrows: 6, cols: 44 | {7:++11 }STUVWXYZrows: 6, cols: 44 |
{7:++12 }{1: } | {7:++12 }{1: } |
{3:-- TERMINAL --} | {3:-- TERMINAL --} |
]]) ]])