patch 8.2.3597: Vim seems to hang when writing a long text to a terminal
Problem: Vim seems to hang when writing a very long text to a terminal
window.
Solution: Limit the amount of text based on 'termwinscroll'. (issue #9080)
This commit is contained in:
@ -7941,6 +7941,9 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
Number of scrollback lines to keep. When going over this limit the
|
||||
first 10% of the scrollback lines are deleted. This is just to reduce
|
||||
the memory usage. See |Terminal-Normal|.
|
||||
Also used as a limit for text sent to the terminal in one write,
|
||||
multiplied by the number of columns times 3 (average number of bytes
|
||||
per cell).
|
||||
|
||||
*'termwinsize'* *'tws'*
|
||||
'termwinsize' 'tws' string (default "")
|
||||
|
||||
@ -1130,10 +1130,24 @@ get_tty_part(term_T *term UNUSED)
|
||||
* Write job output "msg[len]" to the vterm.
|
||||
*/
|
||||
static void
|
||||
term_write_job_output(term_T *term, char_u *msg, size_t len)
|
||||
term_write_job_output(term_T *term, char_u *msg_arg, size_t len_arg)
|
||||
{
|
||||
char_u *msg = msg_arg;
|
||||
size_t len = len_arg;
|
||||
VTerm *vterm = term->tl_vterm;
|
||||
size_t prevlen = vterm_output_get_buffer_current(vterm);
|
||||
size_t limit = term->tl_buffer->b_p_twsl * term->tl_cols * 3;
|
||||
|
||||
// Limit the length to 'termwinscroll' * cols * 3 bytes. Keep the text at
|
||||
// the end.
|
||||
if (len > limit)
|
||||
{
|
||||
char_u *p = msg + len - limit;
|
||||
|
||||
p -= (*mb_head_off)(msg, p);
|
||||
len -= p - msg;
|
||||
msg = p;
|
||||
}
|
||||
|
||||
vterm_input_write(vterm, (char *)msg, len);
|
||||
|
||||
|
||||
@ -757,6 +757,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
3597,
|
||||
/**/
|
||||
3596,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user