mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 03:05:11 -07:00
tui: 'guicursor' color
For now only supports valid hex colors (does not check for the validity the hex color) when termguicolors is set, otherwise it won't attempt to change the cursor color.
This commit is contained in:
parent
dd4a5fcbb6
commit
54bab0019b
@ -2802,7 +2802,8 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
the height of the cursor can be changed. This can be done by
|
the height of the cursor can be changed. This can be done by
|
||||||
specifying a block cursor, or a percentage for a vertical or
|
specifying a block cursor, or a percentage for a vertical or
|
||||||
horizontal cursor.
|
horizontal cursor.
|
||||||
For a console the 't_SI' and 't_EI' escape sequences are used.
|
For a console, shape is taken into account and color as well if
|
||||||
|
'termguicolors' is set. 't_SI' and 't_EI' are deprecated in neovim.
|
||||||
|
|
||||||
The option is a comma separated list of parts. Each part consist of a
|
The option is a comma separated list of parts. Each part consist of a
|
||||||
mode-list and an argument-list:
|
mode-list and an argument-list:
|
||||||
|
@ -48,9 +48,9 @@ static bool did_syntax_onoff = false;
|
|||||||
struct hl_group {
|
struct hl_group {
|
||||||
char_u *sg_name; ///< highlight group name
|
char_u *sg_name; ///< highlight group name
|
||||||
char_u *sg_name_u; ///< uppercase of sg_name
|
char_u *sg_name_u; ///< uppercase of sg_name
|
||||||
int sg_attr; ///< Screen attr
|
int sg_attr; ///< Screen attr @see ATTR_ENTRY
|
||||||
int sg_link; ///< link to this highlight group ID
|
int sg_link; ///< link to this highlight group ID
|
||||||
int sg_set; ///< combination of SG_* flags
|
int sg_set; ///< combination of flags in \ref SG_SET
|
||||||
scid_T sg_scriptID; ///< script in which the group was last set
|
scid_T sg_scriptID; ///< script in which the group was last set
|
||||||
// for terminal UIs
|
// for terminal UIs
|
||||||
int sg_cterm; ///< "cterm=" highlighting attr
|
int sg_cterm; ///< "cterm=" highlighting attr
|
||||||
@ -59,6 +59,7 @@ struct hl_group {
|
|||||||
int sg_cterm_bold; ///< bold attr was set for light color
|
int sg_cterm_bold; ///< bold attr was set for light color
|
||||||
// for RGB UIs
|
// for RGB UIs
|
||||||
int sg_gui; ///< "gui=" highlighting attributes
|
int sg_gui; ///< "gui=" highlighting attributes
|
||||||
|
///< (combination of \ref HL_ATTRIBUTES)
|
||||||
RgbValue sg_rgb_fg; ///< RGB foreground color
|
RgbValue sg_rgb_fg; ///< RGB foreground color
|
||||||
RgbValue sg_rgb_bg; ///< RGB background color
|
RgbValue sg_rgb_bg; ///< RGB background color
|
||||||
RgbValue sg_rgb_sp; ///< RGB special color
|
RgbValue sg_rgb_sp; ///< RGB special color
|
||||||
@ -67,9 +68,12 @@ struct hl_group {
|
|||||||
uint8_t *sg_rgb_sp_name; ///< RGB special color name
|
uint8_t *sg_rgb_sp_name; ///< RGB special color name
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// \addtogroup SG_SET
|
||||||
|
/// @{
|
||||||
#define SG_CTERM 2 // cterm has been set
|
#define SG_CTERM 2 // cterm has been set
|
||||||
#define SG_GUI 4 // gui has been set
|
#define SG_GUI 4 // gui has been set
|
||||||
#define SG_LINK 8 // link has been set
|
#define SG_LINK 8 // link has been set
|
||||||
|
/// @}
|
||||||
|
|
||||||
// highlight groups for 'highlight' option
|
// highlight groups for 'highlight' option
|
||||||
static garray_T highlight_ga = GA_EMPTY_INIT_VALUE;
|
static garray_T highlight_ga = GA_EMPTY_INIT_VALUE;
|
||||||
@ -6093,16 +6097,16 @@ int load_colors(char_u *name)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle the ":highlight .." command.
|
/// Handle the ":highlight .." command.
|
||||||
* When using ":hi clear" this is called recursively for each group with
|
/// When using ":hi clear" this is called recursively for each group with
|
||||||
* "forceit" and "init" both TRUE.
|
/// "forceit" and "init" both TRUE.
|
||||||
*/
|
/// @param init TRUE when called for initializing
|
||||||
void
|
void
|
||||||
do_highlight (
|
do_highlight(
|
||||||
char_u *line,
|
char_u *line,
|
||||||
int forceit,
|
int forceit,
|
||||||
int init /* TRUE when called for initializing */
|
int init
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
char_u *name_end;
|
char_u *name_end;
|
||||||
@ -6704,12 +6708,10 @@ static garray_T attr_table = GA_EMPTY_INIT_VALUE;
|
|||||||
#define ATTR_ENTRY(idx) ((attrentry_T *)attr_table.ga_data)[idx]
|
#define ATTR_ENTRY(idx) ((attrentry_T *)attr_table.ga_data)[idx]
|
||||||
|
|
||||||
|
|
||||||
/*
|
/// Return the attr number for a set of colors and font.
|
||||||
* Return the attr number for a set of colors and font.
|
/// Add a new entry to the term_attr_table, attr_table or gui_attr_table
|
||||||
* Add a new entry to the term_attr_table, attr_table or gui_attr_table
|
/// if the combination is new.
|
||||||
* if the combination is new.
|
/// @return 0 for error.
|
||||||
* Return 0 for error.
|
|
||||||
*/
|
|
||||||
int get_attr_entry(attrentry_T *aep)
|
int get_attr_entry(attrentry_T *aep)
|
||||||
{
|
{
|
||||||
garray_T *table = &attr_table;
|
garray_T *table = &attr_table;
|
||||||
@ -6932,7 +6934,7 @@ static int highlight_list_arg(int id, int didh, int type, int iarg, char_u *sarg
|
|||||||
|
|
||||||
/// Check whether highlight group has attribute
|
/// Check whether highlight group has attribute
|
||||||
///
|
///
|
||||||
/// @param[in] id Highilght group to check.
|
/// @param[in] id Highlight group to check.
|
||||||
/// @param[in] flag Attribute to check.
|
/// @param[in] flag Attribute to check.
|
||||||
/// @param[in] modec 'g' for GUI, 'c' for term.
|
/// @param[in] modec 'g' for GUI, 'c' for term.
|
||||||
///
|
///
|
||||||
@ -8245,7 +8247,14 @@ color_name_table_T color_name_table[] = {
|
|||||||
{ NULL, 0 },
|
{ NULL, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
RgbValue name_to_color(uint8_t *name)
|
|
||||||
|
/// Translate to RgbValue if \p name is an hex value (e.g. #XXXXXX),
|
||||||
|
/// else look into color_name_table to translate a color name to its
|
||||||
|
/// hex value
|
||||||
|
///
|
||||||
|
/// @param[in] name string value to convert to RGB
|
||||||
|
/// return the hex value or -1 if could not find a correct value
|
||||||
|
RgbValue name_to_color(const uint8_t *name)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (name[0] == '#' && isxdigit(name[1]) && isxdigit(name[2])
|
if (name[0] == '#' && isxdigit(name[1]) && isxdigit(name[2])
|
||||||
|
@ -5,10 +5,11 @@
|
|||||||
|
|
||||||
#include "nvim/buffer_defs.h"
|
#include "nvim/buffer_defs.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* Terminal highlighting attribute bits.
|
/// Terminal highlighting attribute bits.
|
||||||
* Attributes above HL_ALL are used for syntax highlighting.
|
/// Attributes above HL_ALL are used for syntax highlighting.
|
||||||
*/
|
/// \addtogroup HL_ATTRIBUTES
|
||||||
|
/// @{
|
||||||
#define HL_NORMAL 0x00
|
#define HL_NORMAL 0x00
|
||||||
#define HL_INVERSE 0x01
|
#define HL_INVERSE 0x01
|
||||||
#define HL_BOLD 0x02
|
#define HL_BOLD 0x02
|
||||||
@ -16,6 +17,7 @@
|
|||||||
#define HL_UNDERLINE 0x08
|
#define HL_UNDERLINE 0x08
|
||||||
#define HL_UNDERCURL 0x10
|
#define HL_UNDERCURL 0x10
|
||||||
#define HL_STANDOUT 0x20
|
#define HL_STANDOUT 0x20
|
||||||
|
/// @}
|
||||||
|
|
||||||
#define HL_CONTAINED 0x01 /* not used on toplevel */
|
#define HL_CONTAINED 0x01 /* not used on toplevel */
|
||||||
#define HL_TRANSP 0x02 /* has no highlighting */
|
#define HL_TRANSP 0x02 /* has no highlighting */
|
||||||
|
@ -78,6 +78,7 @@ typedef struct {
|
|||||||
int enable_mouse, disable_mouse;
|
int enable_mouse, disable_mouse;
|
||||||
int enable_bracketed_paste, disable_bracketed_paste;
|
int enable_bracketed_paste, disable_bracketed_paste;
|
||||||
int set_rgb_foreground, set_rgb_background;
|
int set_rgb_foreground, set_rgb_background;
|
||||||
|
int set_cursor_color;
|
||||||
int enable_focus_reporting, disable_focus_reporting;
|
int enable_focus_reporting, disable_focus_reporting;
|
||||||
} unibi_ext;
|
} unibi_ext;
|
||||||
} TUIData;
|
} TUIData;
|
||||||
@ -132,6 +133,7 @@ static void terminfo_start(UI *ui)
|
|||||||
data->showing_mode = 0;
|
data->showing_mode = 0;
|
||||||
data->unibi_ext.enable_mouse = -1;
|
data->unibi_ext.enable_mouse = -1;
|
||||||
data->unibi_ext.disable_mouse = -1;
|
data->unibi_ext.disable_mouse = -1;
|
||||||
|
data->unibi_ext.set_cursor_color = -1;
|
||||||
data->unibi_ext.enable_bracketed_paste = -1;
|
data->unibi_ext.enable_bracketed_paste = -1;
|
||||||
data->unibi_ext.disable_bracketed_paste = -1;
|
data->unibi_ext.disable_bracketed_paste = -1;
|
||||||
data->unibi_ext.enable_focus_reporting = -1;
|
data->unibi_ext.enable_focus_reporting = -1;
|
||||||
@ -548,8 +550,12 @@ static void tui_set_cursor(UI *ui, MouseMode mode)
|
|||||||
case SHAPE_HOR: shape = 3; break;
|
case SHAPE_HOR: shape = 3; break;
|
||||||
default: WLOG("Unknown shape value %d", shape); break;
|
default: WLOG("Unknown shape value %d", shape); break;
|
||||||
}
|
}
|
||||||
printf(TMUX_WRAP("\x1b]50;CursorShape=%d;BlinkingCursorEnabled=%d\x07"),
|
data->params[0].i = shape;
|
||||||
shape, (c.blinkon !=0));
|
data->params[1].i = (c.blinkon ==0);
|
||||||
|
|
||||||
|
unibi_format(vars, vars + 26,
|
||||||
|
TMUX_WRAP("\x1b]50;CursorShape=%p1%d;BlinkingCursorEnabled=%p2%d\x07"),
|
||||||
|
data->params, out, ui, NULL, NULL);
|
||||||
} else if (!vte_version || atoi(vte_version) >= 3900) {
|
} else if (!vte_version || atoi(vte_version) >= 3900) {
|
||||||
// Assume that the terminal supports DECSCUSR unless it is an
|
// Assume that the terminal supports DECSCUSR unless it is an
|
||||||
// old VTE based terminal. This should not get wrapped for tmux,
|
// old VTE based terminal. This should not get wrapped for tmux,
|
||||||
@ -566,6 +572,13 @@ static void tui_set_cursor(UI *ui, MouseMode mode)
|
|||||||
unibi_format(vars, vars + 26, "\x1b[%p1%d q",
|
unibi_format(vars, vars + 26, "\x1b[%p1%d q",
|
||||||
data->params, out, ui, NULL, NULL);
|
data->params, out, ui, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c.id != 0 && ui->rgb) {
|
||||||
|
int attr = syn_id2attr(c.id);
|
||||||
|
attrentry_T *aep = syn_cterm_attr2entry(attr);
|
||||||
|
data->params[0].i = aep->rgb_bg_color;
|
||||||
|
unibi_out(ui, data->unibi_ext.set_cursor_color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns cursor mode from edit mode
|
/// Returns cursor mode from edit mode
|
||||||
@ -1004,6 +1017,8 @@ static void fix_terminfo(TUIData *data)
|
|||||||
|
|
||||||
end:
|
end:
|
||||||
// Fill some empty slots with common terminal strings
|
// Fill some empty slots with common terminal strings
|
||||||
|
data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
|
||||||
|
ut, NULL, "\033]12;#%p1%06x\007");
|
||||||
data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(ut, NULL,
|
data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(ut, NULL,
|
||||||
"\x1b[?1002h\x1b[?1006h");
|
"\x1b[?1002h\x1b[?1006h");
|
||||||
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, NULL,
|
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, NULL,
|
||||||
|
Loading…
Reference in New Issue
Block a user