Patch 8.0.0798
Problem:    No highlighting in a terminal window with a finished job.
Solution:   Highlight the text.
Files:      src/terminal.c, src/proto/terminal.pro, src/screen.c, undo.c


*** ../vim-8.0.0797/src/terminal.c      2017-07-28 21:51:53.003136578 +0200
--- src/terminal.c      2017-07-28 22:28:19.976444649 +0200
***************
*** 19,25 ****
   *    Uses pseudo-tty's (pty's).
   *
   * For each terminal one VTerm is constructed.  This uses libvterm.  A copy of
!  * that library is in the libvterm directory.
   *
   * When a terminal window is opened, a job is started that will be connected 
to
   * the terminal emulator.
--- 19,25 ----
   *    Uses pseudo-tty's (pty's).
   *
   * For each terminal one VTerm is constructed.  This uses libvterm.  A copy of
!  * this library is in the libvterm directory.
   *
   * When a terminal window is opened, a job is started that will be connected 
to
   * the terminal emulator.
***************
*** 32,47 ****
   * line range is stored in tl_dirty_row_start and tl_dirty_row_end.  Once in a
   * while, if the terminal window is visible, the screen contents is drawn.
   *
   * TODO:
   * - For the scrollback buffer store lines in the buffer, only attributes in
   *   tl_scrollback.
   * - When the job ends:
-  *   - Display the scrollback buffer (but with attributes).
-  *     Make the buffer not modifiable, drop attributes when making changes.
   *   - Need an option or argument to drop the window+buffer right away, to be
   *     used for a shell or Vim.
   * - To set BS correctly, check get_stty(); Pass the fd of the pty.
-  * - Patch for functions: Yasuhiro Matsumoto, #1871
   * - do not store terminal buffer in viminfo.  Or prefix term:// ?
   * - add a character in :ls output
   * - when closing window and job has not ended, make terminal hidden?
--- 32,48 ----
   * line range is stored in tl_dirty_row_start and tl_dirty_row_end.  Once in a
   * while, if the terminal window is visible, the screen contents is drawn.
   *
+  * When the job ends the text is put in a buffer.  Redrawing then happens from
+  * that buffer, attributes come from the scrollback buffer tl_scrollback.
+  *
   * TODO:
+  * - Patch for functions: Yasuhiro Matsumoto, #1871
   * - For the scrollback buffer store lines in the buffer, only attributes in
   *   tl_scrollback.
   * - When the job ends:
   *   - Need an option or argument to drop the window+buffer right away, to be
   *     used for a shell or Vim.
   * - To set BS correctly, check get_stty(); Pass the fd of the pty.
   * - do not store terminal buffer in viminfo.  Or prefix term:// ?
   * - add a character in :ls output
   * - when closing window and job has not ended, make terminal hidden?
***************
*** 254,259 ****
--- 255,273 ----
  }
  
  /*
+  * Free the scrollback buffer for "term".
+  */
+     static void
+ free_scrollback(term_T *term)
+ {
+     int i;
+ 
+     for (i = 0; i < term->tl_scrollback.ga_len; ++i)
+       vim_free(((sb_line_T *)term->tl_scrollback.ga_data + i)->sb_cells);
+     ga_clear(&term->tl_scrollback);
+ }
+ 
+ /*
   * Free a terminal and everything it refers to.
   * Kills the job if there is one.
   * Called when wiping out a buffer.
***************
*** 263,269 ****
  {
      term_T    *term = buf->b_term;
      term_T    *tp;
-     int               i;
  
      if (term == NULL)
        return;
--- 277,282 ----
***************
*** 285,293 ****
        job_unref(term->tl_job);
      }
  
!     for (i = 0; i < term->tl_scrollback.ga_len; ++i)
!       vim_free(((sb_line_T *)term->tl_scrollback.ga_data + i) ->sb_cells);
!     ga_clear(&term->tl_scrollback);
  
      term_free_vterm(term);
      vim_free(term->tl_title);
--- 298,304 ----
        job_unref(term->tl_job);
      }
  
!     free_scrollback(term);
  
      term_free_vterm(term);
      vim_free(term->tl_title);
***************
*** 1218,1223 ****
--- 1229,1276 ----
  }
  
  /*
+  * Return TRUE if "wp" is a terminal window where the job has finished.
+  */
+     int
+ term_is_finished(buf_T *buf)
+ {
+     return buf->b_term != NULL && buf->b_term->tl_vterm == NULL;
+ }
+ 
+ /*
+  * The current buffer is going to be changed.  If there is terminal
+  * highlighting remove it now.
+  */
+     void
+ term_change_in_curbuf(void)
+ {
+     term_T *term = curbuf->b_term;
+ 
+     if (term_is_finished(curbuf) && term->tl_scrollback.ga_len > 0)
+     {
+       free_scrollback(term);
+       redraw_buf_later(term->tl_buffer, NOT_VALID);
+     }
+ }
+ 
+ /*
+  * Get the screen attribute for a position in the buffer.
+  */
+     int
+ term_get_attr(buf_T *buf, linenr_T lnum, int col)
+ {
+     term_T *term = buf->b_term;
+     sb_line_T *line;
+ 
+     if (lnum >= term->tl_scrollback.ga_len)
+       return 0;
+     line = (sb_line_T *)term->tl_scrollback.ga_data + lnum - 1;
+     if (col >= line->sb_cols)
+       return 0;
+     return cell2attr(line->sb_cells + col);
+ }
+ 
+ /*
   * Set job options common for Unix and MS-Windows.
   */
      static void
*** ../vim-8.0.0797/src/proto/terminal.pro      2017-07-28 21:51:53.007136551 
+0200
--- src/proto/terminal.pro      2017-07-28 22:26:25.225242751 +0200
***************
*** 5,10 ****
--- 5,13 ----
  int terminal_loop(void);
  void term_channel_closed(channel_T *ch);
  int term_update_window(win_T *wp);
+ int term_is_finished(buf_T *buf);
+ void term_change_in_curbuf(void);
+ int term_get_attr(buf_T *buf, linenr_T lnum, int col);
  char_u *term_get_status_text(term_T *term);
  int set_ref_in_term(int copyID);
  /* vim: set ft=c : */
*** ../vim-8.0.0797/src/screen.c        2017-07-28 21:51:53.007136551 +0200
--- src/screen.c        2017-07-28 22:26:13.317325669 +0200
***************
*** 3130,3135 ****
--- 3130,3138 ----
  #if defined(LINE_ATTR)
      int               did_line_attr = 0;
  #endif
+ #ifdef FEAT_TERMINAL
+     int               get_term_attr = FALSE;
+ #endif
  
      /* draw_state: items that are drawn in sequence: */
  #define WL_START      0               /* nothing done yet */
***************
*** 3241,3246 ****
--- 3244,3257 ----
        draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
  #endif
  
+ #ifdef FEAT_TERMINAL
+     if (term_is_finished(wp->w_buffer))
+     {
+       extra_check = TRUE;
+       get_term_attr = TRUE;
+     }
+ #endif
+ 
  #ifdef FEAT_SPELL
      if (wp->w_p_spell
            && *wp->w_s->b_p_spl != NUL
***************
*** 4527,4532 ****
--- 4538,4555 ----
                int     can_spell = TRUE;
  #endif
  
+ #ifdef FEAT_TERMINAL
+               if (get_term_attr)
+               {
+                   syntax_attr = term_get_attr(wp->w_buffer, lnum, col);
+ 
+                   if (!attr_pri)
+                       char_attr = syntax_attr;
+                   else
+                       char_attr = hl_combine_attr(syntax_attr, char_attr);
+               }
+ #endif
+ 
  #ifdef FEAT_SYN_HL
                /* Get syntax attribute, unless still at the start of the line
                 * (double-wide char that doesn't fit). */
*** ../vim-8.0.0797/src/undo.c  2017-06-11 23:09:11.624295294 +0200
--- src/undo.c  2017-07-28 22:16:56.165112069 +0200
***************
*** 419,424 ****
--- 419,428 ----
            }
        }
  #endif
+ #ifdef FEAT_TERMINAL
+       /* A change in a terminal buffer removes the highlighting. */
+       term_change_in_curbuf();
+ #endif
  
  #ifdef FEAT_AUTOCMD
        /*
*** ../vim-8.0.0797/src/version.c       2017-07-28 21:51:53.011136524 +0200
--- src/version.c       2017-07-28 22:03:35.926466147 +0200
***************
*** 771,772 ****
--- 771,774 ----
  {   /* Add new patch number below this line */
+ /**/
+     798,
  /**/

-- 
Facepalm statement #5: "Petrol getting more expensive?  Not for me, I'm always
tanking for 20 dollars"

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui