To: vim_dev@googlegroups.com Subject: Patch 8.0.0798 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///