int tl_scrollback_scrolled;
garray_T tl_scrollback_postponed;
+ char_u *tl_highlight_name; // replaces "Terminal"; allocated
+
cellattr_T tl_default_color;
linenr_T tl_top_diff_rows; // rows of top diff file or zero
else
term->tl_api = vim_strsave((char_u *)"Tapi_");
+ if (opt->jo_set2 & JO2_TERM_HIGHLIGHT)
+ term->tl_highlight_name = vim_strsave(opt->jo_term_highlight);
+
// System dependent: setup the vterm and maybe start the job in it.
if (argv == NULL
&& argvar->v_type == VAR_STRING
if (term->tl_out_fd != NULL)
fclose(term->tl_out_fd);
#endif
+ vim_free(term->tl_highlight_name);
vim_free(term->tl_cursor_color);
vim_free(term);
}
return in_terminal_loop != NULL;
}
+/*
+ * Return the highight group name for the terminal; "Terminal" if not set.
+ */
+ static char_u *
+term_get_highlight_name(term_T *term)
+{
+ if (term->tl_highlight_name == NULL)
+ return (char_u *)"Terminal";
+ return term->tl_highlight_name;
+}
+
#if defined(FEAT_GUI) || defined(PROTO)
cursorentry_T *
term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg)
entry.blinkoff = 250;
}
- // The "Terminal" highlight group overrules the defaults.
- id = syn_name2id((char_u *)"Terminal");
+ // The highlight group overrules the defaults.
+ id = syn_name2id(term_get_highlight_name(term));
if (id != 0)
{
syn_id2colors(id, &term_fg, &term_bg);
}
}
+/*
+ * Cache "Terminal" highlight group colors.
+ */
+ void
+set_terminal_default_colors(int cterm_fg, int cterm_bg)
+{
+ term_default_cterm_fg = cterm_fg - 1;
+ term_default_cterm_bg = cterm_bg - 1;
+}
+
+ static int
+get_default_cterm_fg(term_T *term)
+{
+ if (term->tl_highlight_name != NULL)
+ {
+ int id = syn_name2id(term->tl_highlight_name);
+ int fg = -1;
+ int bg = -1;
+
+ if (id > 0)
+ syn_id2cterm_bg(id, &fg, &bg);
+ return fg;
+ }
+ return term_default_cterm_fg;
+}
+
+ static int
+get_default_cterm_bg(term_T *term)
+{
+ if (term->tl_highlight_name != NULL)
+ {
+ int id = syn_name2id(term->tl_highlight_name);
+ int fg = -1;
+ int bg = -1;
+
+ if (id > 0)
+ syn_id2cterm_bg(id, &fg, &bg);
+ return bg;
+ }
+ return term_default_cterm_bg;
+}
+
/*
* Reverse engineer the RGB value into a cterm color index.
* First color is 1. Return 0 if no match found (default color).
*/
static int
cell2attr(
+ term_T *term,
win_T *wp,
VTermScreenCellAttrs cellattrs,
VTermColor cellfg,
{
if (wincolor_fg >= 0)
fg = wincolor_fg + 1;
- else if (term_default_cterm_fg >= 0)
- fg = term_default_cterm_fg + 1;
+ else
+ {
+ int cterm_fg = get_default_cterm_fg(term);
+
+ if (cterm_fg >= 0)
+ fg = cterm_fg + 1;
+ }
}
if (bg == 0)
{
if (wincolor_bg >= 0)
bg = wincolor_bg + 1;
- else if (term_default_cterm_bg >= 0)
- bg = term_default_cterm_bg + 1;
+ else
+ {
+ int cterm_bg = get_default_cterm_bg(term);
+
+ if (cterm_bg >= 0)
+ bg = cterm_bg + 1;
+ }
}
}
// Set the color to clear lines with.
vterm_state_get_default_colors(vterm_obtain_state(term->tl_vterm),
&fg, &bg);
- clear_attr = cell2attr(wp, attr, fg, bg);
+ clear_attr = cell2attr(term, wp, attr, fg, bg);
win_del_lines(wp, start_row, count, FALSE, FALSE, clear_attr);
}
}
*/
static void
term_line2screenline(
+ term_T *term,
win_T *wp,
VTermScreen *screen,
VTermPos *pos,
else
ScreenLines[off] = c;
}
- ScreenAttrs[off] = cell2attr(wp, cell.attrs, cell.fg, cell.bg);
+ ScreenAttrs[off] = cell2attr(term, wp, cell.attrs, cell.fg, cell.bg);
++pos->col;
++off;
{
int max_col = MIN(Columns, term->tl_cols);
- term_line2screenline(NULL, screen, &pos, max_col);
+ term_line2screenline(term, NULL, screen, &pos, max_col);
}
else
pos.col = 0;
{
int max_col = MIN(wp->w_width, term->tl_cols);
- term_line2screenline(wp, screen, &pos, max_col);
+ term_line2screenline(term, wp, screen, &pos, max_col);
}
else
pos.col = 0;
else
cellattr = line->sb_cells + col;
}
- return cell2attr(wp, cellattr->attrs, cellattr->fg, cellattr->bg);
+ return cell2attr(term, wp, cellattr->attrs, cellattr->fg, cellattr->bg);
}
/*
bg->red = bg->green = bg->blue = bgval;
fg->ansi_index = bg->ansi_index = VTERM_ANSI_INDEX_DEFAULT;
- // The 'wincolor' or "Terminal" highlight group overrules the defaults.
+ // The 'wincolor' or the highlight group overrules the defaults.
if (wp != NULL && *wp->w_p_wcr != NUL)
id = syn_name2id(wp->w_p_wcr);
else
- id = syn_name2id((char_u *)"Terminal");
+ id = syn_name2id(term_get_highlight_name(term));
// Use the actual color for the GUI and when 'termguicolors' is set.
#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
#endif
if (id != 0 && t_colors >= 16)
{
- if (term_default_cterm_fg >= 0)
- cterm_color2vterm(term_default_cterm_fg, fg);
- if (term_default_cterm_bg >= 0)
- cterm_color2vterm(term_default_cterm_bg, bg);
+ int cterm_fg = get_default_cterm_fg(term);
+ int cterm_bg = get_default_cterm_bg(term);
+
+ if (cterm_fg >= 0)
+ cterm_color2vterm(cterm_fg, fg);
+ if (cterm_bg >= 0)
+ cterm_color2vterm(cterm_bg, bg);
}
else
{
return abort;
}
-/*
- * Cache "Terminal" highlight group colors.
- */
- void
-set_terminal_default_colors(int cterm_fg, int cterm_bg)
-{
- term_default_cterm_fg = cterm_fg - 1;
- term_default_cterm_bg = cterm_bg - 1;
-}
-
/*
* Get the buffer from the first argument in "argvars".
* Returns NULL when the buffer is not for a terminal window and logs a message
bg.red, bg.green, bg.blue);
dict_add_string(dcell, "bg", rgb);
- dict_add_number(dcell, "attr", cell2attr(NULL, attrs, fg, bg));
+ dict_add_number(dcell, "attr", cell2attr(term, NULL, attrs, fg, bg));
dict_add_number(dcell, "width", width);
++pos.col;
JO2_TERM_NAME + JO2_TERM_FINISH + JO2_HIDDEN + JO2_TERM_OPENCMD
+ JO2_TERM_COLS + JO2_TERM_ROWS + JO2_VERTICAL + JO2_CURWIN
+ JO2_CWD + JO2_ENV + JO2_EOF_CHARS
- + JO2_NORESTORE + JO2_TERM_KILL
+ + JO2_NORESTORE + JO2_TERM_KILL + JO2_TERM_HIGHLIGHT
+ JO2_ANSI_COLORS + JO2_TTY_TYPE + JO2_TERM_API) == FAIL)
return;
jobopt_T *orig_opt UNUSED)
{
term->tl_arg0_cmd = NULL;
+ if (opt->jo_set2 & JO2_TERM_HIGHLIGHT)
+ term->tl_highlight_name = vim_strsave(opt->jo_term_highlight);
if (create_vterm(term, term->tl_rows, term->tl_cols) == FAIL)
return FAIL;
let lines = [
\ 'set t_u7=',
\ 'call setline(1, range(20))',
- \ 'hi PopTerm ctermbg=grey',
\ 'func OpenTerm()',
\ " let s:buf = term_start('cat Xtext', #{hidden: 1})",
\ ' let g:winid = popup_create(s:buf, #{ border: []})',
call delete('XtermPopup')
endfunc
+" Check a terminal in popup window with different colors
+func Terminal_in_popup_colored(group_name, highlight_cmd, highlight_opt)
+ CheckRunVimInTerminal
+ CheckUnix
+
+ let lines = [
+ \ 'set t_u7=',
+ \ 'call setline(1, range(20))',
+ \ 'func OpenTerm()',
+ \ " let s:buf = term_start('cat', #{hidden: 1, "
+ \ .. a:highlight_opt .. "})",
+ \ ' let g:winid = popup_create(s:buf, #{ border: []})',
+ \ 'endfunc',
+ \ a:highlight_cmd,
+ \ ]
+ call writefile(lines, 'XtermPopup')
+ let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
+ call term_wait(buf, 200)
+ call term_sendkeys(buf, ":set noruler\<CR>")
+ call term_sendkeys(buf, ":call OpenTerm()\<CR>")
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, "hello\<CR>")
+ call VerifyScreenDump(buf, 'Test_terminal_popup_' .. a:group_name, {})
+
+ call term_sendkeys(buf, "\<C-D>")
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, ":q\<CR>")
+ call term_wait(buf, 100) " wait for terminal to vanish
+ call StopVimInTerminal(buf)
+ call delete('XtermPopup')
+endfunc
+
+func Test_terminal_in_popup_colored_Terminal()
+ call Terminal_in_popup_colored("Terminal", "highlight Terminal ctermfg=blue ctermbg=yellow", "")
+endfunc
+
+func Test_terminal_in_popup_colored_group()
+ call Terminal_in_popup_colored("MyTermCol", "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue", "term_highlight: 'MyTermCol',")
+endfunc
+
func Test_double_popup_terminal()
let buf1 = term_start(&shell, #{hidden: 1})
let win1 = popup_create(buf1, {})