Mercurial > vim
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);