changeset 13680:c32e9628dc30 v8.0.1712

patch 8.0.1712: terminal scrollback is not limited commit https://github.com/vim/vim/commit/8c041b6b95f49f7383cf00e2036cf009b326fa8d Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 14 18:14:06 2018 +0200 patch 8.0.1712: terminal scrollback is not limited Problem: Terminal scrollback is not limited. Solution: Add the 'terminalscroll' option.
author Christian Brabandt <cb@256bit.org>
date Sat, 14 Apr 2018 18:15:06 +0200
parents 7989c11f96d2
children cea7c555bd3e
files runtime/doc/options.txt runtime/doc/terminal.txt src/option.c src/option.h src/terminal.c src/version.c
diffstat 6 files changed, 54 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt*	For Vim version 8.0.  Last change: 2018 Mar 13
+*options.txt*	For Vim version 8.0.  Last change: 2018 Apr 14
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -7933,6 +7933,16 @@ A jump table for the options with a shor
 	Note that the "cterm" attributes are still used, not the "gui" ones.
 	NOTE: This option is reset when 'compatible' is set.
 
+						*'terminalscroll'* *'tlsl'*
+'terminalscroll' 'tlsl'	number	(default 10000)
+			global
+			{not in Vi}
+			{not available when compiled without the
+			|+terminal| feature}
+	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|.
+
 						*'termkey'* *'tk'*
 'termkey' 'tk'		string	(default "")
 			local to window
--- a/runtime/doc/terminal.txt
+++ b/runtime/doc/terminal.txt
@@ -288,7 +288,7 @@ not when 'termsize' is "rowsXcols".
 
 
 Terminal-Job and Terminal-Normal mode ~
-							*Terminal-mode*
+						*Terminal-mode* *Terminal-Job*
 When the job is running the contents of the terminal is under control of the
 job.  That includes the cursor position.  Typed keys are sent to the job.
 The terminal contents can change at any time.  This is called Terminal-Job
@@ -301,7 +301,9 @@ suspended.  CTRL-\ CTRL-N does the same.
 Terminal-Job mode is where |:tmap| mappings are applied. Keys sent by
 |term_sendkeys()| are not subject to tmap, but keys from |feedkeys()| are.
 
-							*E946*
+It is not possible to enter Insert mode from Terminal-Job mode.
+
+						*Terminal-Normal* *E946*
 In Terminal-Normal mode you can move the cursor around with the usual Vim
 commands, Visually mark text, yank text, etc.  But you cannot change the
 contents of the buffer.  The commands that would start insert mode, such as
@@ -312,7 +314,10 @@ In Terminal-Normal mode the statusline a
 the job ends while in Terminal-Normal mode this changes to
 "(Terminal-finished)".
 
-It is not possible to enter Insert mode from Terminal-Job mode.
+When the job outputs lines in the terminal, such that the contents scrolls off
+the top, those lines are remembered and can be seen in Terminal-Normal mode.
+The number of lines is limited by the 'terminalscroll' option. When going over
+this limit, the first 10% of the scrolled lins are deleted and are lost.
 
 
 Cursor style ~
--- a/src/option.c
+++ b/src/option.c
@@ -2750,6 +2750,15 @@ static struct vimoption options[] =
 			    {(char_u *)FALSE, (char_u *)FALSE}
 #endif
 			    SCRIPTID_INIT},
+    {"terminalscroll", "tlsl", P_NUM|P_VI_DEF|P_VIM|P_RBUF,
+#ifdef FEAT_TERMINAL
+			    (char_u *)&p_tlsl, PV_NONE,
+			    {(char_u *)10000L, (char_u *)10000L}
+#else
+			    (char_u *)NULL, PV_NONE,
+			    {(char_u *)NULL, (char_u *)0L}
+#endif
+			    SCRIPTID_INIT},
     {"termkey", "tk",	    P_STRING|P_ALLOCED|P_RWIN|P_VI_DEF,
 #ifdef FEAT_TERMINAL
 			    (char_u *)VAR_WIN, PV_TK,
--- a/src/option.h
+++ b/src/option.h
@@ -849,6 +849,9 @@ EXTERN char_u	*p_tcldll;	/* 'tcldll' */
 #ifdef FEAT_ARABIC
 EXTERN int	p_tbidi;	/* 'termbidi' */
 #endif
+#ifdef FEAT_TERMINAL
+EXTERN long	p_tlsl;		/* 'terminalscroll' */
+#endif
 #ifdef FEAT_MBYTE
 EXTERN char_u	*p_tenc;	/* 'termencoding' */
 #endif
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -40,8 +40,6 @@
  * TODO:
  * - Win32: Make terminal used for :!cmd in the GUI work better.  Allow for
  *   redirection.  Probably in call to channel_set_pipes().
- * - add an optional limit for the scrollback size.  When reaching it remove
- *   10% at the start.
  * - Copy text in the vterm to the Vim buffer once in a while, so that
  *   completion works.
  * - in GUI vertical split causes problems.  Cursor is flickering. (Hirohito
@@ -2518,7 +2516,27 @@ handle_pushline(int cols, const VTermScr
 {
     term_T	*term = (term_T *)user;
 
-    /* TODO: Limit the number of lines that are stored. */
+    /* If the number of lines that are stored goes over 'termscrollback' then
+     * delete the first 10%. */
+    if (term->tl_scrollback.ga_len > p_tlsl)
+    {
+	int	todo = p_tlsl / 10;
+	int	i;
+
+	curbuf = term->tl_buffer;
+	for (i = 0; i < todo; ++i)
+	{
+	    vim_free(((sb_line_T *)term->tl_scrollback.ga_data + i)->sb_cells);
+	    ml_delete(1, FALSE);
+	}
+	curbuf = curwin->w_buffer;
+
+	term->tl_scrollback.ga_len -= todo;
+	mch_memmove(term->tl_scrollback.ga_data,
+	    (sb_line_T *)term->tl_scrollback.ga_data + todo,
+	    sizeof(sb_line_T) * term->tl_scrollback.ga_len);
+    }
+
     if (ga_grow(&term->tl_scrollback, 1) == OK)
     {
 	cellattr_T	*p = NULL;
--- a/src/version.c
+++ b/src/version.c
@@ -763,6 +763,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1712,
+/**/
     1711,
 /**/
     1710,