]> granicus.if.org Git - vim/commitdiff
patch 8.0.1712: terminal scrollback is not limited v8.0.1712
authorBram Moolenaar <Bram@vim.org>
Sat, 14 Apr 2018 16:14:06 +0000 (18:14 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 14 Apr 2018 16:14:06 +0000 (18:14 +0200)
Problem:    Terminal scrollback is not limited.
Solution:   Add the 'terminalscroll' option.

runtime/doc/options.txt
runtime/doc/terminal.txt
src/option.c
src/option.h
src/terminal.c
src/version.c

index cc19e253def5e81f8792d6b8030add9c1bd34d1c..0820699c67e4a67fc6999398437554ba4530e027 100644 (file)
@@ -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 short description can be found at |Q_op|.
        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
index 63217c2fa05443b7cb97deb91517cb2d5156b3a2..23e210dc84832b91597c9af903d963270a658b5d 100644 (file)
@@ -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 and window title show "(Terminal)".  If
 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 ~
index 5ef346c8d4a1a9e7e62c38b1bde974b5d4f2677e..9ebc51183324a8ea33ef6ac1f8c65c6cddb1edf0 100644 (file)
@@ -2748,6 +2748,15 @@ static struct vimoption options[] =
 #else
                            (char_u*)NULL, PV_NONE,
                            {(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,
index d2ee54534c242c2340024fd4949f0636d6d312dd..45f1a36bc2ab059d236f20d0e678dd9db33921c9 100644 (file)
@@ -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
index 09d48872da83aa68a6dee4354962e4ebea0948fe..7162d684c82cce46d233bcdae942b0e78b99ede0 100644 (file)
@@ -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 VTermScreenCell *cells, void *user)
 {
     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;
index 255e24bd989962660833988c47a00029f0346fcf..41b9721caeb467d6fb5eaf9242896df41e81538c 100644 (file)
@@ -762,6 +762,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1712,
 /**/
     1711,
 /**/