# HG changeset patch # User Bram Moolenaar # Date 1636996503 -3600 # Node ID ddfb2b8aed674b257223d214d85187e4e47c98bc # Parent ba2b6a32f53629fbe906842682e2ac9fad54ebc9 patch 8.2.3597: Vim seems to hang when writing a long text to a terminal Commit: https://github.com/vim/vim/commit/36968af1558b295b5fdf56973d5dcc75fce85658 Author: Bram Moolenaar Date: Mon Nov 15 17:13:11 2021 +0000 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) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -7941,6 +7941,9 @@ A jump table for the options with a shor 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 "") diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -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); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3597, +/**/ 3596, /**/ 3595,