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.