summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/options.txt3
-rw-r--r--src/terminal.c16
-rw-r--r--src/version.c2
3 files changed, 20 insertions, 1 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index cf953c115..7fe371b52 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -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 "")
diff --git a/src/terminal.c b/src/terminal.c
index 1adf690ad..fb8b2881f 100644
--- 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
index 39a61c915..9cf0ee639 100644
--- 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,