changeset 26129:ddfb2b8aed67 v8.2.3597

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 <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Mon, 15 Nov 2021 18:15:03 +0100
parents ba2b6a32f536
children 42600a15fce6
files runtime/doc/options.txt src/terminal.c src/version.c
diffstat 3 files changed, 21 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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 "")
--- 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);
 
--- 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,