1f9cc9f20SBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet: 2f9cc9f20SBram Moolenaar * 3f9cc9f20SBram Moolenaar * VIM - Vi IMproved by Bram Moolenaar 4f9cc9f20SBram Moolenaar * 5f9cc9f20SBram Moolenaar * Do ":help uganda" in Vim to read copying and usage conditions. 6f9cc9f20SBram Moolenaar * Do ":help credits" in Vim to see a list of people who contributed. 7f9cc9f20SBram Moolenaar * See README.txt for an overview of the Vim source code. 8f9cc9f20SBram Moolenaar */ 9f9cc9f20SBram Moolenaar 10f9cc9f20SBram Moolenaar /* 11f9cc9f20SBram Moolenaar * Highlighting stuff 12f9cc9f20SBram Moolenaar */ 13f9cc9f20SBram Moolenaar 14f9cc9f20SBram Moolenaar #include "vim.h" 15f9cc9f20SBram Moolenaar 16f9cc9f20SBram Moolenaar #define SG_TERM 1 // term has been set 17f9cc9f20SBram Moolenaar #define SG_CTERM 2 // cterm has been set 18f9cc9f20SBram Moolenaar #define SG_GUI 4 // gui has been set 19f9cc9f20SBram Moolenaar #define SG_LINK 8 // link has been set 20f9cc9f20SBram Moolenaar 21f9cc9f20SBram Moolenaar /* 22f9cc9f20SBram Moolenaar * The "term", "cterm" and "gui" arguments can be any combination of the 23f9cc9f20SBram Moolenaar * following names, separated by commas (but no spaces!). 24f9cc9f20SBram Moolenaar */ 25f9cc9f20SBram Moolenaar static char *(hl_name_table[]) = 26f9cc9f20SBram Moolenaar {"bold", "standout", "underline", "undercurl", 27f9cc9f20SBram Moolenaar "italic", "reverse", "inverse", "nocombine", "strikethrough", "NONE"}; 28f9cc9f20SBram Moolenaar static int hl_attr_table[] = 29f9cc9f20SBram Moolenaar {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, HL_NOCOMBINE, HL_STRIKETHROUGH, 0}; 30f9cc9f20SBram Moolenaar #define ATTR_COMBINE(attr_a, attr_b) ((((attr_b) & HL_NOCOMBINE) ? attr_b : (attr_a)) | (attr_b)) 31f9cc9f20SBram Moolenaar 32*2ac6e82aSBram Moolenaar /* 33*2ac6e82aSBram Moolenaar * Structure that stores information about a highlight group. 34*2ac6e82aSBram Moolenaar * The ID of a highlight group is also called group ID. It is the index in 35*2ac6e82aSBram Moolenaar * the highlight_ga array PLUS ONE. 36*2ac6e82aSBram Moolenaar */ 37*2ac6e82aSBram Moolenaar typedef struct 38*2ac6e82aSBram Moolenaar { 39*2ac6e82aSBram Moolenaar char_u *sg_name; // highlight group name 40*2ac6e82aSBram Moolenaar char_u *sg_name_u; // uppercase of sg_name 41*2ac6e82aSBram Moolenaar int sg_cleared; // "hi clear" was used 42*2ac6e82aSBram Moolenaar // for normal terminals 43*2ac6e82aSBram Moolenaar int sg_term; // "term=" highlighting attributes 44*2ac6e82aSBram Moolenaar char_u *sg_start; // terminal string for start highl 45*2ac6e82aSBram Moolenaar char_u *sg_stop; // terminal string for stop highl 46*2ac6e82aSBram Moolenaar int sg_term_attr; // Screen attr for term mode 47*2ac6e82aSBram Moolenaar // for color terminals 48*2ac6e82aSBram Moolenaar int sg_cterm; // "cterm=" highlighting attr 49*2ac6e82aSBram Moolenaar int sg_cterm_bold; // bold attr was set for light color 50*2ac6e82aSBram Moolenaar int sg_cterm_fg; // terminal fg color number + 1 51*2ac6e82aSBram Moolenaar int sg_cterm_bg; // terminal bg color number + 1 52*2ac6e82aSBram Moolenaar int sg_cterm_attr; // Screen attr for color term mode 53*2ac6e82aSBram Moolenaar // for when using the GUI 54*2ac6e82aSBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 55*2ac6e82aSBram Moolenaar guicolor_T sg_gui_fg; // GUI foreground color handle 56*2ac6e82aSBram Moolenaar guicolor_T sg_gui_bg; // GUI background color handle 57*2ac6e82aSBram Moolenaar #endif 58*2ac6e82aSBram Moolenaar #ifdef FEAT_GUI 59*2ac6e82aSBram Moolenaar guicolor_T sg_gui_sp; // GUI special color handle 60*2ac6e82aSBram Moolenaar GuiFont sg_font; // GUI font handle 61*2ac6e82aSBram Moolenaar #ifdef FEAT_XFONTSET 62*2ac6e82aSBram Moolenaar GuiFontset sg_fontset; // GUI fontset handle 63*2ac6e82aSBram Moolenaar #endif 64*2ac6e82aSBram Moolenaar char_u *sg_font_name; // GUI font or fontset name 65*2ac6e82aSBram Moolenaar int sg_gui_attr; // Screen attr for GUI mode 66*2ac6e82aSBram Moolenaar #endif 67*2ac6e82aSBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 68*2ac6e82aSBram Moolenaar // Store the sp color name for the GUI or synIDattr() 69*2ac6e82aSBram Moolenaar int sg_gui; // "gui=" highlighting attributes 70*2ac6e82aSBram Moolenaar char_u *sg_gui_fg_name;// GUI foreground color name 71*2ac6e82aSBram Moolenaar char_u *sg_gui_bg_name;// GUI background color name 72*2ac6e82aSBram Moolenaar char_u *sg_gui_sp_name;// GUI special color name 73*2ac6e82aSBram Moolenaar #endif 74*2ac6e82aSBram Moolenaar int sg_link; // link to this highlight group ID 75*2ac6e82aSBram Moolenaar int sg_set; // combination of SG_* flags 76*2ac6e82aSBram Moolenaar #ifdef FEAT_EVAL 77*2ac6e82aSBram Moolenaar sctx_T sg_script_ctx; // script in which the group was last set 78*2ac6e82aSBram Moolenaar #endif 79*2ac6e82aSBram Moolenaar } hl_group_T; 80*2ac6e82aSBram Moolenaar 81*2ac6e82aSBram Moolenaar // highlight groups for 'highlight' option 82*2ac6e82aSBram Moolenaar static garray_T highlight_ga; 83*2ac6e82aSBram Moolenaar #define HL_TABLE() ((hl_group_T *)((highlight_ga.ga_data))) 84*2ac6e82aSBram Moolenaar 85*2ac6e82aSBram Moolenaar /* 86*2ac6e82aSBram Moolenaar * An attribute number is the index in attr_table plus ATTR_OFF. 87*2ac6e82aSBram Moolenaar */ 88*2ac6e82aSBram Moolenaar #define ATTR_OFF (HL_ALL + 1) 89*2ac6e82aSBram Moolenaar 90f9cc9f20SBram Moolenaar static void syn_unadd_group(void); 91f9cc9f20SBram Moolenaar static void set_hl_attr(int idx); 92f9cc9f20SBram Moolenaar static void highlight_list_one(int id); 93f9cc9f20SBram Moolenaar static int highlight_list_arg(int id, int didh, int type, int iarg, char_u *sarg, char *name); 94f9cc9f20SBram Moolenaar static int syn_add_group(char_u *name); 95f9cc9f20SBram Moolenaar static int hl_has_settings(int idx, int check_link); 96f9cc9f20SBram Moolenaar static void highlight_clear(int idx); 97f9cc9f20SBram Moolenaar 98f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 99f9cc9f20SBram Moolenaar static void gui_do_one_color(int idx, int do_menu, int do_tooltip); 100f9cc9f20SBram Moolenaar #endif 101f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 102f9cc9f20SBram Moolenaar static int set_group_colors(char_u *name, guicolor_T *fgp, guicolor_T *bgp, int do_menu, int use_norm, int do_tooltip); 103f9cc9f20SBram Moolenaar static void hl_do_font(int idx, char_u *arg, int do_normal, int do_menu, int do_tooltip, int free_font); 104f9cc9f20SBram Moolenaar #endif 105f9cc9f20SBram Moolenaar 106f9cc9f20SBram Moolenaar /* 107f9cc9f20SBram Moolenaar * The default highlight groups. These are compiled-in for fast startup and 108f9cc9f20SBram Moolenaar * they still work when the runtime files can't be found. 109f9cc9f20SBram Moolenaar * When making changes here, also change runtime/colors/default.vim! 110f9cc9f20SBram Moolenaar * The #ifdefs are needed to reduce the amount of static data. Helps to make 111f9cc9f20SBram Moolenaar * the 16 bit DOS (museum) version compile. 112f9cc9f20SBram Moolenaar */ 113f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 114f9cc9f20SBram Moolenaar # define CENT(a, b) b 115f9cc9f20SBram Moolenaar #else 116f9cc9f20SBram Moolenaar # define CENT(a, b) a 117f9cc9f20SBram Moolenaar #endif 118f9cc9f20SBram Moolenaar static char *(highlight_init_both[]) = { 119f9cc9f20SBram Moolenaar CENT("ErrorMsg term=standout ctermbg=DarkRed ctermfg=White", 120f9cc9f20SBram Moolenaar "ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White"), 121f9cc9f20SBram Moolenaar CENT("IncSearch term=reverse cterm=reverse", 122f9cc9f20SBram Moolenaar "IncSearch term=reverse cterm=reverse gui=reverse"), 123f9cc9f20SBram Moolenaar CENT("ModeMsg term=bold cterm=bold", 124f9cc9f20SBram Moolenaar "ModeMsg term=bold cterm=bold gui=bold"), 125f9cc9f20SBram Moolenaar CENT("NonText term=bold ctermfg=Blue", 126f9cc9f20SBram Moolenaar "NonText term=bold ctermfg=Blue gui=bold guifg=Blue"), 127f9cc9f20SBram Moolenaar CENT("StatusLine term=reverse,bold cterm=reverse,bold", 128f9cc9f20SBram Moolenaar "StatusLine term=reverse,bold cterm=reverse,bold gui=reverse,bold"), 129f9cc9f20SBram Moolenaar CENT("StatusLineNC term=reverse cterm=reverse", 130f9cc9f20SBram Moolenaar "StatusLineNC term=reverse cterm=reverse gui=reverse"), 131f9cc9f20SBram Moolenaar "default link EndOfBuffer NonText", 132f9cc9f20SBram Moolenaar CENT("VertSplit term=reverse cterm=reverse", 133f9cc9f20SBram Moolenaar "VertSplit term=reverse cterm=reverse gui=reverse"), 134f9cc9f20SBram Moolenaar #ifdef FEAT_CLIPBOARD 135f9cc9f20SBram Moolenaar CENT("VisualNOS term=underline,bold cterm=underline,bold", 136f9cc9f20SBram Moolenaar "VisualNOS term=underline,bold cterm=underline,bold gui=underline,bold"), 137f9cc9f20SBram Moolenaar #endif 138f9cc9f20SBram Moolenaar #ifdef FEAT_DIFF 139f9cc9f20SBram Moolenaar CENT("DiffText term=reverse cterm=bold ctermbg=Red", 140f9cc9f20SBram Moolenaar "DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red"), 141f9cc9f20SBram Moolenaar #endif 142f9cc9f20SBram Moolenaar #ifdef FEAT_INS_EXPAND 143f9cc9f20SBram Moolenaar CENT("PmenuSbar ctermbg=Grey", 144f9cc9f20SBram Moolenaar "PmenuSbar ctermbg=Grey guibg=Grey"), 145f9cc9f20SBram Moolenaar #endif 146f9cc9f20SBram Moolenaar CENT("TabLineSel term=bold cterm=bold", 147f9cc9f20SBram Moolenaar "TabLineSel term=bold cterm=bold gui=bold"), 148f9cc9f20SBram Moolenaar CENT("TabLineFill term=reverse cterm=reverse", 149f9cc9f20SBram Moolenaar "TabLineFill term=reverse cterm=reverse gui=reverse"), 150f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 151f9cc9f20SBram Moolenaar "Cursor guibg=fg guifg=bg", 152f9cc9f20SBram Moolenaar "lCursor guibg=fg guifg=bg", // should be different, but what? 153f9cc9f20SBram Moolenaar #endif 154f9cc9f20SBram Moolenaar "default link QuickFixLine Search", 155f9cc9f20SBram Moolenaar CENT("Normal cterm=NONE", "Normal gui=NONE"), 156f9cc9f20SBram Moolenaar NULL 157f9cc9f20SBram Moolenaar }; 158f9cc9f20SBram Moolenaar 159f9cc9f20SBram Moolenaar /* Default colors only used with a light background. */ 160f9cc9f20SBram Moolenaar static char *(highlight_init_light[]) = { 161f9cc9f20SBram Moolenaar CENT("Directory term=bold ctermfg=DarkBlue", 162f9cc9f20SBram Moolenaar "Directory term=bold ctermfg=DarkBlue guifg=Blue"), 163f9cc9f20SBram Moolenaar CENT("LineNr term=underline ctermfg=Brown", 164f9cc9f20SBram Moolenaar "LineNr term=underline ctermfg=Brown guifg=Brown"), 165f9cc9f20SBram Moolenaar CENT("CursorLineNr term=bold ctermfg=Brown", 166f9cc9f20SBram Moolenaar "CursorLineNr term=bold ctermfg=Brown gui=bold guifg=Brown"), 167f9cc9f20SBram Moolenaar CENT("MoreMsg term=bold ctermfg=DarkGreen", 168f9cc9f20SBram Moolenaar "MoreMsg term=bold ctermfg=DarkGreen gui=bold guifg=SeaGreen"), 169f9cc9f20SBram Moolenaar CENT("Question term=standout ctermfg=DarkGreen", 170f9cc9f20SBram Moolenaar "Question term=standout ctermfg=DarkGreen gui=bold guifg=SeaGreen"), 171f9cc9f20SBram Moolenaar CENT("Search term=reverse ctermbg=Yellow ctermfg=NONE", 172f9cc9f20SBram Moolenaar "Search term=reverse ctermbg=Yellow ctermfg=NONE guibg=Yellow guifg=NONE"), 173f9cc9f20SBram Moolenaar #ifdef FEAT_SPELL 174f9cc9f20SBram Moolenaar CENT("SpellBad term=reverse ctermbg=LightRed", 175f9cc9f20SBram Moolenaar "SpellBad term=reverse ctermbg=LightRed guisp=Red gui=undercurl"), 176f9cc9f20SBram Moolenaar CENT("SpellCap term=reverse ctermbg=LightBlue", 177f9cc9f20SBram Moolenaar "SpellCap term=reverse ctermbg=LightBlue guisp=Blue gui=undercurl"), 178f9cc9f20SBram Moolenaar CENT("SpellRare term=reverse ctermbg=LightMagenta", 179f9cc9f20SBram Moolenaar "SpellRare term=reverse ctermbg=LightMagenta guisp=Magenta gui=undercurl"), 180f9cc9f20SBram Moolenaar CENT("SpellLocal term=underline ctermbg=Cyan", 181f9cc9f20SBram Moolenaar "SpellLocal term=underline ctermbg=Cyan guisp=DarkCyan gui=undercurl"), 182f9cc9f20SBram Moolenaar #endif 183f9cc9f20SBram Moolenaar #ifdef FEAT_INS_EXPAND 184f9cc9f20SBram Moolenaar CENT("PmenuThumb ctermbg=Black", 185f9cc9f20SBram Moolenaar "PmenuThumb ctermbg=Black guibg=Black"), 186f9cc9f20SBram Moolenaar CENT("Pmenu ctermbg=LightMagenta ctermfg=Black", 187f9cc9f20SBram Moolenaar "Pmenu ctermbg=LightMagenta ctermfg=Black guibg=LightMagenta"), 188f9cc9f20SBram Moolenaar CENT("PmenuSel ctermbg=LightGrey ctermfg=Black", 189f9cc9f20SBram Moolenaar "PmenuSel ctermbg=LightGrey ctermfg=Black guibg=Grey"), 190f9cc9f20SBram Moolenaar #endif 191f9cc9f20SBram Moolenaar CENT("SpecialKey term=bold ctermfg=DarkBlue", 192f9cc9f20SBram Moolenaar "SpecialKey term=bold ctermfg=DarkBlue guifg=Blue"), 193f9cc9f20SBram Moolenaar CENT("Title term=bold ctermfg=DarkMagenta", 194f9cc9f20SBram Moolenaar "Title term=bold ctermfg=DarkMagenta gui=bold guifg=Magenta"), 195f9cc9f20SBram Moolenaar CENT("WarningMsg term=standout ctermfg=DarkRed", 196f9cc9f20SBram Moolenaar "WarningMsg term=standout ctermfg=DarkRed guifg=Red"), 197f9cc9f20SBram Moolenaar #ifdef FEAT_WILDMENU 198f9cc9f20SBram Moolenaar CENT("WildMenu term=standout ctermbg=Yellow ctermfg=Black", 199f9cc9f20SBram Moolenaar "WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), 200f9cc9f20SBram Moolenaar #endif 201f9cc9f20SBram Moolenaar #ifdef FEAT_FOLDING 202f9cc9f20SBram Moolenaar CENT("Folded term=standout ctermbg=Grey ctermfg=DarkBlue", 203f9cc9f20SBram Moolenaar "Folded term=standout ctermbg=Grey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue"), 204f9cc9f20SBram Moolenaar CENT("FoldColumn term=standout ctermbg=Grey ctermfg=DarkBlue", 205f9cc9f20SBram Moolenaar "FoldColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue"), 206f9cc9f20SBram Moolenaar #endif 207f9cc9f20SBram Moolenaar #ifdef FEAT_SIGNS 208f9cc9f20SBram Moolenaar CENT("SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue", 209f9cc9f20SBram Moolenaar "SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue"), 210f9cc9f20SBram Moolenaar #endif 211f9cc9f20SBram Moolenaar CENT("Visual term=reverse", 212f9cc9f20SBram Moolenaar "Visual term=reverse guibg=LightGrey"), 213f9cc9f20SBram Moolenaar #ifdef FEAT_DIFF 214f9cc9f20SBram Moolenaar CENT("DiffAdd term=bold ctermbg=LightBlue", 215f9cc9f20SBram Moolenaar "DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue"), 216f9cc9f20SBram Moolenaar CENT("DiffChange term=bold ctermbg=LightMagenta", 217f9cc9f20SBram Moolenaar "DiffChange term=bold ctermbg=LightMagenta guibg=LightMagenta"), 218f9cc9f20SBram Moolenaar CENT("DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan", 219f9cc9f20SBram Moolenaar "DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan gui=bold guifg=Blue guibg=LightCyan"), 220f9cc9f20SBram Moolenaar #endif 221f9cc9f20SBram Moolenaar CENT("TabLine term=underline cterm=underline ctermfg=black ctermbg=LightGrey", 222f9cc9f20SBram Moolenaar "TabLine term=underline cterm=underline ctermfg=black ctermbg=LightGrey gui=underline guibg=LightGrey"), 223f9cc9f20SBram Moolenaar #ifdef FEAT_SYN_HL 224f9cc9f20SBram Moolenaar CENT("CursorColumn term=reverse ctermbg=LightGrey", 225f9cc9f20SBram Moolenaar "CursorColumn term=reverse ctermbg=LightGrey guibg=Grey90"), 226f9cc9f20SBram Moolenaar CENT("CursorLine term=underline cterm=underline", 227f9cc9f20SBram Moolenaar "CursorLine term=underline cterm=underline guibg=Grey90"), 228f9cc9f20SBram Moolenaar CENT("ColorColumn term=reverse ctermbg=LightRed", 229f9cc9f20SBram Moolenaar "ColorColumn term=reverse ctermbg=LightRed guibg=LightRed"), 230f9cc9f20SBram Moolenaar #endif 231f9cc9f20SBram Moolenaar #ifdef FEAT_CONCEAL 232f9cc9f20SBram Moolenaar CENT("Conceal ctermbg=DarkGrey ctermfg=LightGrey", 233f9cc9f20SBram Moolenaar "Conceal ctermbg=DarkGrey ctermfg=LightGrey guibg=DarkGrey guifg=LightGrey"), 234f9cc9f20SBram Moolenaar #endif 235f9cc9f20SBram Moolenaar CENT("MatchParen term=reverse ctermbg=Cyan", 236f9cc9f20SBram Moolenaar "MatchParen term=reverse ctermbg=Cyan guibg=Cyan"), 237f9cc9f20SBram Moolenaar #ifdef FEAT_TERMINAL 238f9cc9f20SBram Moolenaar CENT("StatusLineTerm term=reverse,bold cterm=bold ctermfg=White ctermbg=DarkGreen", 239f9cc9f20SBram Moolenaar "StatusLineTerm term=reverse,bold cterm=bold ctermfg=White ctermbg=DarkGreen gui=bold guifg=bg guibg=DarkGreen"), 240f9cc9f20SBram Moolenaar CENT("StatusLineTermNC term=reverse ctermfg=White ctermbg=DarkGreen", 241f9cc9f20SBram Moolenaar "StatusLineTermNC term=reverse ctermfg=White ctermbg=DarkGreen guifg=bg guibg=DarkGreen"), 242f9cc9f20SBram Moolenaar #endif 243f9cc9f20SBram Moolenaar #ifdef FEAT_MENU 244f9cc9f20SBram Moolenaar CENT("ToolbarLine term=underline ctermbg=LightGrey", 245f9cc9f20SBram Moolenaar "ToolbarLine term=underline ctermbg=LightGrey guibg=LightGrey"), 246f9cc9f20SBram Moolenaar CENT("ToolbarButton cterm=bold ctermfg=White ctermbg=DarkGrey", 247f9cc9f20SBram Moolenaar "ToolbarButton cterm=bold ctermfg=White ctermbg=DarkGrey gui=bold guifg=White guibg=Grey40"), 248f9cc9f20SBram Moolenaar #endif 249f9cc9f20SBram Moolenaar NULL 250f9cc9f20SBram Moolenaar }; 251f9cc9f20SBram Moolenaar 252f9cc9f20SBram Moolenaar /* Default colors only used with a dark background. */ 253f9cc9f20SBram Moolenaar static char *(highlight_init_dark[]) = { 254f9cc9f20SBram Moolenaar CENT("Directory term=bold ctermfg=LightCyan", 255f9cc9f20SBram Moolenaar "Directory term=bold ctermfg=LightCyan guifg=Cyan"), 256f9cc9f20SBram Moolenaar CENT("LineNr term=underline ctermfg=Yellow", 257f9cc9f20SBram Moolenaar "LineNr term=underline ctermfg=Yellow guifg=Yellow"), 258f9cc9f20SBram Moolenaar CENT("CursorLineNr term=bold ctermfg=Yellow", 259f9cc9f20SBram Moolenaar "CursorLineNr term=bold ctermfg=Yellow gui=bold guifg=Yellow"), 260f9cc9f20SBram Moolenaar CENT("MoreMsg term=bold ctermfg=LightGreen", 261f9cc9f20SBram Moolenaar "MoreMsg term=bold ctermfg=LightGreen gui=bold guifg=SeaGreen"), 262f9cc9f20SBram Moolenaar CENT("Question term=standout ctermfg=LightGreen", 263f9cc9f20SBram Moolenaar "Question term=standout ctermfg=LightGreen gui=bold guifg=Green"), 264f9cc9f20SBram Moolenaar CENT("Search term=reverse ctermbg=Yellow ctermfg=Black", 265f9cc9f20SBram Moolenaar "Search term=reverse ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), 266f9cc9f20SBram Moolenaar CENT("SpecialKey term=bold ctermfg=LightBlue", 267f9cc9f20SBram Moolenaar "SpecialKey term=bold ctermfg=LightBlue guifg=Cyan"), 268f9cc9f20SBram Moolenaar #ifdef FEAT_SPELL 269f9cc9f20SBram Moolenaar CENT("SpellBad term=reverse ctermbg=Red", 270f9cc9f20SBram Moolenaar "SpellBad term=reverse ctermbg=Red guisp=Red gui=undercurl"), 271f9cc9f20SBram Moolenaar CENT("SpellCap term=reverse ctermbg=Blue", 272f9cc9f20SBram Moolenaar "SpellCap term=reverse ctermbg=Blue guisp=Blue gui=undercurl"), 273f9cc9f20SBram Moolenaar CENT("SpellRare term=reverse ctermbg=Magenta", 274f9cc9f20SBram Moolenaar "SpellRare term=reverse ctermbg=Magenta guisp=Magenta gui=undercurl"), 275f9cc9f20SBram Moolenaar CENT("SpellLocal term=underline ctermbg=Cyan", 276f9cc9f20SBram Moolenaar "SpellLocal term=underline ctermbg=Cyan guisp=Cyan gui=undercurl"), 277f9cc9f20SBram Moolenaar #endif 278f9cc9f20SBram Moolenaar #ifdef FEAT_INS_EXPAND 279f9cc9f20SBram Moolenaar CENT("PmenuThumb ctermbg=White", 280f9cc9f20SBram Moolenaar "PmenuThumb ctermbg=White guibg=White"), 281f9cc9f20SBram Moolenaar CENT("Pmenu ctermbg=Magenta ctermfg=Black", 282f9cc9f20SBram Moolenaar "Pmenu ctermbg=Magenta ctermfg=Black guibg=Magenta"), 283f9cc9f20SBram Moolenaar CENT("PmenuSel ctermbg=Black ctermfg=DarkGrey", 284f9cc9f20SBram Moolenaar "PmenuSel ctermbg=Black ctermfg=DarkGrey guibg=DarkGrey"), 285f9cc9f20SBram Moolenaar #endif 286f9cc9f20SBram Moolenaar CENT("Title term=bold ctermfg=LightMagenta", 287f9cc9f20SBram Moolenaar "Title term=bold ctermfg=LightMagenta gui=bold guifg=Magenta"), 288f9cc9f20SBram Moolenaar CENT("WarningMsg term=standout ctermfg=LightRed", 289f9cc9f20SBram Moolenaar "WarningMsg term=standout ctermfg=LightRed guifg=Red"), 290f9cc9f20SBram Moolenaar #ifdef FEAT_WILDMENU 291f9cc9f20SBram Moolenaar CENT("WildMenu term=standout ctermbg=Yellow ctermfg=Black", 292f9cc9f20SBram Moolenaar "WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), 293f9cc9f20SBram Moolenaar #endif 294f9cc9f20SBram Moolenaar #ifdef FEAT_FOLDING 295f9cc9f20SBram Moolenaar CENT("Folded term=standout ctermbg=DarkGrey ctermfg=Cyan", 296f9cc9f20SBram Moolenaar "Folded term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=DarkGrey guifg=Cyan"), 297f9cc9f20SBram Moolenaar CENT("FoldColumn term=standout ctermbg=DarkGrey ctermfg=Cyan", 298f9cc9f20SBram Moolenaar "FoldColumn term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=Grey guifg=Cyan"), 299f9cc9f20SBram Moolenaar #endif 300f9cc9f20SBram Moolenaar #ifdef FEAT_SIGNS 301f9cc9f20SBram Moolenaar CENT("SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan", 302f9cc9f20SBram Moolenaar "SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=Grey guifg=Cyan"), 303f9cc9f20SBram Moolenaar #endif 304f9cc9f20SBram Moolenaar CENT("Visual term=reverse", 305f9cc9f20SBram Moolenaar "Visual term=reverse guibg=DarkGrey"), 306f9cc9f20SBram Moolenaar #ifdef FEAT_DIFF 307f9cc9f20SBram Moolenaar CENT("DiffAdd term=bold ctermbg=DarkBlue", 308f9cc9f20SBram Moolenaar "DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue"), 309f9cc9f20SBram Moolenaar CENT("DiffChange term=bold ctermbg=DarkMagenta", 310f9cc9f20SBram Moolenaar "DiffChange term=bold ctermbg=DarkMagenta guibg=DarkMagenta"), 311f9cc9f20SBram Moolenaar CENT("DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan", 312f9cc9f20SBram Moolenaar "DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan gui=bold guifg=Blue guibg=DarkCyan"), 313f9cc9f20SBram Moolenaar #endif 314f9cc9f20SBram Moolenaar CENT("TabLine term=underline cterm=underline ctermfg=white ctermbg=DarkGrey", 315f9cc9f20SBram Moolenaar "TabLine term=underline cterm=underline ctermfg=white ctermbg=DarkGrey gui=underline guibg=DarkGrey"), 316f9cc9f20SBram Moolenaar #ifdef FEAT_SYN_HL 317f9cc9f20SBram Moolenaar CENT("CursorColumn term=reverse ctermbg=DarkGrey", 318f9cc9f20SBram Moolenaar "CursorColumn term=reverse ctermbg=DarkGrey guibg=Grey40"), 319f9cc9f20SBram Moolenaar CENT("CursorLine term=underline cterm=underline", 320f9cc9f20SBram Moolenaar "CursorLine term=underline cterm=underline guibg=Grey40"), 321f9cc9f20SBram Moolenaar CENT("ColorColumn term=reverse ctermbg=DarkRed", 322f9cc9f20SBram Moolenaar "ColorColumn term=reverse ctermbg=DarkRed guibg=DarkRed"), 323f9cc9f20SBram Moolenaar #endif 324f9cc9f20SBram Moolenaar CENT("MatchParen term=reverse ctermbg=DarkCyan", 325f9cc9f20SBram Moolenaar "MatchParen term=reverse ctermbg=DarkCyan guibg=DarkCyan"), 326f9cc9f20SBram Moolenaar #ifdef FEAT_CONCEAL 327f9cc9f20SBram Moolenaar CENT("Conceal ctermbg=DarkGrey ctermfg=LightGrey", 328f9cc9f20SBram Moolenaar "Conceal ctermbg=DarkGrey ctermfg=LightGrey guibg=DarkGrey guifg=LightGrey"), 329f9cc9f20SBram Moolenaar #endif 330f9cc9f20SBram Moolenaar #ifdef FEAT_TERMINAL 331f9cc9f20SBram Moolenaar CENT("StatusLineTerm term=reverse,bold cterm=bold ctermfg=Black ctermbg=LightGreen", 332f9cc9f20SBram Moolenaar "StatusLineTerm term=reverse,bold cterm=bold ctermfg=Black ctermbg=LightGreen gui=bold guifg=bg guibg=LightGreen"), 333f9cc9f20SBram Moolenaar CENT("StatusLineTermNC term=reverse ctermfg=Black ctermbg=LightGreen", 334f9cc9f20SBram Moolenaar "StatusLineTermNC term=reverse ctermfg=Black ctermbg=LightGreen guifg=bg guibg=LightGreen"), 335f9cc9f20SBram Moolenaar #endif 336f9cc9f20SBram Moolenaar #ifdef FEAT_MENU 337f9cc9f20SBram Moolenaar CENT("ToolbarLine term=underline ctermbg=DarkGrey", 338f9cc9f20SBram Moolenaar "ToolbarLine term=underline ctermbg=DarkGrey guibg=Grey50"), 339f9cc9f20SBram Moolenaar CENT("ToolbarButton cterm=bold ctermfg=Black ctermbg=LightGrey", 340f9cc9f20SBram Moolenaar "ToolbarButton cterm=bold ctermfg=Black ctermbg=LightGrey gui=bold guifg=Black guibg=LightGrey"), 341f9cc9f20SBram Moolenaar #endif 342f9cc9f20SBram Moolenaar NULL 343f9cc9f20SBram Moolenaar }; 344f9cc9f20SBram Moolenaar 345*2ac6e82aSBram Moolenaar /* 346*2ac6e82aSBram Moolenaar * Returns the number of highlight groups. 347*2ac6e82aSBram Moolenaar */ 348*2ac6e82aSBram Moolenaar int 349*2ac6e82aSBram Moolenaar highlight_num_groups(void) 350*2ac6e82aSBram Moolenaar { 351*2ac6e82aSBram Moolenaar return highlight_ga.ga_len; 352*2ac6e82aSBram Moolenaar } 353*2ac6e82aSBram Moolenaar 354*2ac6e82aSBram Moolenaar /* 355*2ac6e82aSBram Moolenaar * Returns the name of a highlight group. 356*2ac6e82aSBram Moolenaar */ 357*2ac6e82aSBram Moolenaar char_u * 358*2ac6e82aSBram Moolenaar highlight_group_name(int id) 359*2ac6e82aSBram Moolenaar { 360*2ac6e82aSBram Moolenaar return HL_TABLE()[id].sg_name; 361*2ac6e82aSBram Moolenaar } 362*2ac6e82aSBram Moolenaar 363*2ac6e82aSBram Moolenaar /* 364*2ac6e82aSBram Moolenaar * Returns the ID of the link to a highlight group. 365*2ac6e82aSBram Moolenaar */ 366*2ac6e82aSBram Moolenaar int 367*2ac6e82aSBram Moolenaar highlight_link_id(int id) 368*2ac6e82aSBram Moolenaar { 369*2ac6e82aSBram Moolenaar return HL_TABLE()[id].sg_link; 370*2ac6e82aSBram Moolenaar } 371*2ac6e82aSBram Moolenaar 372f9cc9f20SBram Moolenaar void 373f9cc9f20SBram Moolenaar init_highlight( 374f9cc9f20SBram Moolenaar int both, // include groups where 'bg' doesn't matter 375f9cc9f20SBram Moolenaar int reset) // clear group first 376f9cc9f20SBram Moolenaar { 377f9cc9f20SBram Moolenaar int i; 378f9cc9f20SBram Moolenaar char **pp; 379f9cc9f20SBram Moolenaar static int had_both = FALSE; 380f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 381f9cc9f20SBram Moolenaar char_u *p; 382f9cc9f20SBram Moolenaar 383f9cc9f20SBram Moolenaar /* 384f9cc9f20SBram Moolenaar * Try finding the color scheme file. Used when a color file was loaded 385f9cc9f20SBram Moolenaar * and 'background' or 't_Co' is changed. 386f9cc9f20SBram Moolenaar */ 387f9cc9f20SBram Moolenaar p = get_var_value((char_u *)"g:colors_name"); 388f9cc9f20SBram Moolenaar if (p != NULL) 389f9cc9f20SBram Moolenaar { 390f9cc9f20SBram Moolenaar // The value of g:colors_name could be freed when sourcing the script, 391f9cc9f20SBram Moolenaar // making "p" invalid, so copy it. 392f9cc9f20SBram Moolenaar char_u *copy_p = vim_strsave(p); 393f9cc9f20SBram Moolenaar int r; 394f9cc9f20SBram Moolenaar 395f9cc9f20SBram Moolenaar if (copy_p != NULL) 396f9cc9f20SBram Moolenaar { 397f9cc9f20SBram Moolenaar r = load_colors(copy_p); 398f9cc9f20SBram Moolenaar vim_free(copy_p); 399f9cc9f20SBram Moolenaar if (r == OK) 400f9cc9f20SBram Moolenaar return; 401f9cc9f20SBram Moolenaar } 402f9cc9f20SBram Moolenaar } 403f9cc9f20SBram Moolenaar 404f9cc9f20SBram Moolenaar #endif 405f9cc9f20SBram Moolenaar 406f9cc9f20SBram Moolenaar /* 407f9cc9f20SBram Moolenaar * Didn't use a color file, use the compiled-in colors. 408f9cc9f20SBram Moolenaar */ 409f9cc9f20SBram Moolenaar if (both) 410f9cc9f20SBram Moolenaar { 411f9cc9f20SBram Moolenaar had_both = TRUE; 412f9cc9f20SBram Moolenaar pp = highlight_init_both; 413f9cc9f20SBram Moolenaar for (i = 0; pp[i] != NULL; ++i) 414f9cc9f20SBram Moolenaar do_highlight((char_u *)pp[i], reset, TRUE); 415f9cc9f20SBram Moolenaar } 416f9cc9f20SBram Moolenaar else if (!had_both) 417f9cc9f20SBram Moolenaar // Don't do anything before the call with both == TRUE from main(). 418f9cc9f20SBram Moolenaar // Not everything has been setup then, and that call will overrule 419f9cc9f20SBram Moolenaar // everything anyway. 420f9cc9f20SBram Moolenaar return; 421f9cc9f20SBram Moolenaar 422f9cc9f20SBram Moolenaar if (*p_bg == 'l') 423f9cc9f20SBram Moolenaar pp = highlight_init_light; 424f9cc9f20SBram Moolenaar else 425f9cc9f20SBram Moolenaar pp = highlight_init_dark; 426f9cc9f20SBram Moolenaar for (i = 0; pp[i] != NULL; ++i) 427f9cc9f20SBram Moolenaar do_highlight((char_u *)pp[i], reset, TRUE); 428f9cc9f20SBram Moolenaar 429f9cc9f20SBram Moolenaar // Reverse looks ugly, but grey may not work for 8 colors. Thus let it 430f9cc9f20SBram Moolenaar // depend on the number of colors available. 431f9cc9f20SBram Moolenaar // With 8 colors brown is equal to yellow, need to use black for Search fg 432f9cc9f20SBram Moolenaar // to avoid Statement highlighted text disappears. 433f9cc9f20SBram Moolenaar // Clear the attributes, needed when changing the t_Co value. 434f9cc9f20SBram Moolenaar if (t_colors > 8) 435f9cc9f20SBram Moolenaar do_highlight((char_u *)(*p_bg == 'l' 436f9cc9f20SBram Moolenaar ? "Visual cterm=NONE ctermbg=LightGrey" 437f9cc9f20SBram Moolenaar : "Visual cterm=NONE ctermbg=DarkGrey"), FALSE, TRUE); 438f9cc9f20SBram Moolenaar else 439f9cc9f20SBram Moolenaar { 440f9cc9f20SBram Moolenaar do_highlight((char_u *)"Visual cterm=reverse ctermbg=NONE", 441f9cc9f20SBram Moolenaar FALSE, TRUE); 442f9cc9f20SBram Moolenaar if (*p_bg == 'l') 443f9cc9f20SBram Moolenaar do_highlight((char_u *)"Search ctermfg=black", FALSE, TRUE); 444f9cc9f20SBram Moolenaar } 445f9cc9f20SBram Moolenaar 446f9cc9f20SBram Moolenaar #ifdef FEAT_SYN_HL 447f9cc9f20SBram Moolenaar /* 448f9cc9f20SBram Moolenaar * If syntax highlighting is enabled load the highlighting for it. 449f9cc9f20SBram Moolenaar */ 450f9cc9f20SBram Moolenaar if (get_var_value((char_u *)"g:syntax_on") != NULL) 451f9cc9f20SBram Moolenaar { 452f9cc9f20SBram Moolenaar static int recursive = 0; 453f9cc9f20SBram Moolenaar 454f9cc9f20SBram Moolenaar if (recursive >= 5) 455f9cc9f20SBram Moolenaar emsg(_("E679: recursive loop loading syncolor.vim")); 456f9cc9f20SBram Moolenaar else 457f9cc9f20SBram Moolenaar { 458f9cc9f20SBram Moolenaar ++recursive; 459f9cc9f20SBram Moolenaar (void)source_runtime((char_u *)"syntax/syncolor.vim", DIP_ALL); 460f9cc9f20SBram Moolenaar --recursive; 461f9cc9f20SBram Moolenaar } 462f9cc9f20SBram Moolenaar } 463f9cc9f20SBram Moolenaar #endif 464f9cc9f20SBram Moolenaar } 465f9cc9f20SBram Moolenaar 466f9cc9f20SBram Moolenaar /* 467f9cc9f20SBram Moolenaar * Load color file "name". 468f9cc9f20SBram Moolenaar * Return OK for success, FAIL for failure. 469f9cc9f20SBram Moolenaar */ 470f9cc9f20SBram Moolenaar int 471f9cc9f20SBram Moolenaar load_colors(char_u *name) 472f9cc9f20SBram Moolenaar { 473f9cc9f20SBram Moolenaar char_u *buf; 474f9cc9f20SBram Moolenaar int retval = FAIL; 475f9cc9f20SBram Moolenaar static int recursive = FALSE; 476f9cc9f20SBram Moolenaar 477f9cc9f20SBram Moolenaar // When being called recursively, this is probably because setting 478f9cc9f20SBram Moolenaar // 'background' caused the highlighting to be reloaded. This means it is 479f9cc9f20SBram Moolenaar // working, thus we should return OK. 480f9cc9f20SBram Moolenaar if (recursive) 481f9cc9f20SBram Moolenaar return OK; 482f9cc9f20SBram Moolenaar 483f9cc9f20SBram Moolenaar recursive = TRUE; 484f9cc9f20SBram Moolenaar buf = alloc(STRLEN(name) + 12); 485f9cc9f20SBram Moolenaar if (buf != NULL) 486f9cc9f20SBram Moolenaar { 487f9cc9f20SBram Moolenaar apply_autocmds(EVENT_COLORSCHEMEPRE, name, 488f9cc9f20SBram Moolenaar curbuf->b_fname, FALSE, curbuf); 489f9cc9f20SBram Moolenaar sprintf((char *)buf, "colors/%s.vim", name); 490f9cc9f20SBram Moolenaar retval = source_runtime(buf, DIP_START + DIP_OPT); 491f9cc9f20SBram Moolenaar vim_free(buf); 492f9cc9f20SBram Moolenaar apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, FALSE, curbuf); 493f9cc9f20SBram Moolenaar } 494f9cc9f20SBram Moolenaar recursive = FALSE; 495f9cc9f20SBram Moolenaar 496f9cc9f20SBram Moolenaar return retval; 497f9cc9f20SBram Moolenaar } 498f9cc9f20SBram Moolenaar 499f9cc9f20SBram Moolenaar static char *(color_names[28]) = { 500f9cc9f20SBram Moolenaar "Black", "DarkBlue", "DarkGreen", "DarkCyan", 501f9cc9f20SBram Moolenaar "DarkRed", "DarkMagenta", "Brown", "DarkYellow", 502f9cc9f20SBram Moolenaar "Gray", "Grey", "LightGray", "LightGrey", 503f9cc9f20SBram Moolenaar "DarkGray", "DarkGrey", 504f9cc9f20SBram Moolenaar "Blue", "LightBlue", "Green", "LightGreen", 505f9cc9f20SBram Moolenaar "Cyan", "LightCyan", "Red", "LightRed", "Magenta", 506f9cc9f20SBram Moolenaar "LightMagenta", "Yellow", "LightYellow", "White", "NONE"}; 507f9cc9f20SBram Moolenaar // indices: 508f9cc9f20SBram Moolenaar // 0, 1, 2, 3, 509f9cc9f20SBram Moolenaar // 4, 5, 6, 7, 510f9cc9f20SBram Moolenaar // 8, 9, 10, 11, 511f9cc9f20SBram Moolenaar // 12, 13, 512f9cc9f20SBram Moolenaar // 14, 15, 16, 17, 513f9cc9f20SBram Moolenaar // 18, 19, 20, 21, 22, 514f9cc9f20SBram Moolenaar // 23, 24, 25, 26, 27 515f9cc9f20SBram Moolenaar static int color_numbers_16[28] = {0, 1, 2, 3, 516f9cc9f20SBram Moolenaar 4, 5, 6, 6, 517f9cc9f20SBram Moolenaar 7, 7, 7, 7, 518f9cc9f20SBram Moolenaar 8, 8, 519f9cc9f20SBram Moolenaar 9, 9, 10, 10, 520f9cc9f20SBram Moolenaar 11, 11, 12, 12, 13, 521f9cc9f20SBram Moolenaar 13, 14, 14, 15, -1}; 522f9cc9f20SBram Moolenaar // for xterm with 88 colors... 523f9cc9f20SBram Moolenaar static int color_numbers_88[28] = {0, 4, 2, 6, 524f9cc9f20SBram Moolenaar 1, 5, 32, 72, 525f9cc9f20SBram Moolenaar 84, 84, 7, 7, 526f9cc9f20SBram Moolenaar 82, 82, 527f9cc9f20SBram Moolenaar 12, 43, 10, 61, 528f9cc9f20SBram Moolenaar 14, 63, 9, 74, 13, 529f9cc9f20SBram Moolenaar 75, 11, 78, 15, -1}; 530f9cc9f20SBram Moolenaar // for xterm with 256 colors... 531f9cc9f20SBram Moolenaar static int color_numbers_256[28] = {0, 4, 2, 6, 532f9cc9f20SBram Moolenaar 1, 5, 130, 130, 533f9cc9f20SBram Moolenaar 248, 248, 7, 7, 534f9cc9f20SBram Moolenaar 242, 242, 535f9cc9f20SBram Moolenaar 12, 81, 10, 121, 536f9cc9f20SBram Moolenaar 14, 159, 9, 224, 13, 537f9cc9f20SBram Moolenaar 225, 11, 229, 15, -1}; 538f9cc9f20SBram Moolenaar // for terminals with less than 16 colors... 539f9cc9f20SBram Moolenaar static int color_numbers_8[28] = {0, 4, 2, 6, 540f9cc9f20SBram Moolenaar 1, 5, 3, 3, 541f9cc9f20SBram Moolenaar 7, 7, 7, 7, 542f9cc9f20SBram Moolenaar 0+8, 0+8, 543f9cc9f20SBram Moolenaar 4+8, 4+8, 2+8, 2+8, 544f9cc9f20SBram Moolenaar 6+8, 6+8, 1+8, 1+8, 5+8, 545f9cc9f20SBram Moolenaar 5+8, 3+8, 3+8, 7+8, -1}; 546f9cc9f20SBram Moolenaar 547f9cc9f20SBram Moolenaar /* 548f9cc9f20SBram Moolenaar * Lookup the "cterm" value to be used for color with index "idx" in 549f9cc9f20SBram Moolenaar * color_names[]. 550f9cc9f20SBram Moolenaar * "boldp" will be set to TRUE or FALSE for a foreground color when using 8 551f9cc9f20SBram Moolenaar * colors, otherwise it will be unchanged. 552f9cc9f20SBram Moolenaar */ 553f9cc9f20SBram Moolenaar int 554f9cc9f20SBram Moolenaar lookup_color(int idx, int foreground, int *boldp) 555f9cc9f20SBram Moolenaar { 556f9cc9f20SBram Moolenaar int color = color_numbers_16[idx]; 557f9cc9f20SBram Moolenaar char_u *p; 558f9cc9f20SBram Moolenaar 559f9cc9f20SBram Moolenaar // Use the _16 table to check if it's a valid color name. 560f9cc9f20SBram Moolenaar if (color < 0) 561f9cc9f20SBram Moolenaar return -1; 562f9cc9f20SBram Moolenaar 563f9cc9f20SBram Moolenaar if (t_colors == 8) 564f9cc9f20SBram Moolenaar { 565f9cc9f20SBram Moolenaar // t_Co is 8: use the 8 colors table 566f9cc9f20SBram Moolenaar #if defined(__QNXNTO__) 567f9cc9f20SBram Moolenaar color = color_numbers_8_qansi[idx]; 568f9cc9f20SBram Moolenaar #else 569f9cc9f20SBram Moolenaar color = color_numbers_8[idx]; 570f9cc9f20SBram Moolenaar #endif 571f9cc9f20SBram Moolenaar if (foreground) 572f9cc9f20SBram Moolenaar { 573f9cc9f20SBram Moolenaar // set/reset bold attribute to get light foreground 574f9cc9f20SBram Moolenaar // colors (on some terminals, e.g. "linux") 575f9cc9f20SBram Moolenaar if (color & 8) 576f9cc9f20SBram Moolenaar *boldp = TRUE; 577f9cc9f20SBram Moolenaar else 578f9cc9f20SBram Moolenaar *boldp = FALSE; 579f9cc9f20SBram Moolenaar } 580f9cc9f20SBram Moolenaar color &= 7; // truncate to 8 colors 581f9cc9f20SBram Moolenaar } 582f9cc9f20SBram Moolenaar else if (t_colors == 16 || t_colors == 88 583f9cc9f20SBram Moolenaar || t_colors >= 256) 584f9cc9f20SBram Moolenaar { 585f9cc9f20SBram Moolenaar /* 586f9cc9f20SBram Moolenaar * Guess: if the termcap entry ends in 'm', it is 587f9cc9f20SBram Moolenaar * probably an xterm-like terminal. Use the changed 588f9cc9f20SBram Moolenaar * order for colors. 589f9cc9f20SBram Moolenaar */ 590f9cc9f20SBram Moolenaar if (*T_CAF != NUL) 591f9cc9f20SBram Moolenaar p = T_CAF; 592f9cc9f20SBram Moolenaar else 593f9cc9f20SBram Moolenaar p = T_CSF; 594f9cc9f20SBram Moolenaar if (*p != NUL && (t_colors > 256 595f9cc9f20SBram Moolenaar || *(p + STRLEN(p) - 1) == 'm')) 596f9cc9f20SBram Moolenaar { 597f9cc9f20SBram Moolenaar if (t_colors == 88) 598f9cc9f20SBram Moolenaar color = color_numbers_88[idx]; 599f9cc9f20SBram Moolenaar else if (t_colors >= 256) 600f9cc9f20SBram Moolenaar color = color_numbers_256[idx]; 601f9cc9f20SBram Moolenaar else 602f9cc9f20SBram Moolenaar color = color_numbers_8[idx]; 603f9cc9f20SBram Moolenaar } 604f9cc9f20SBram Moolenaar #ifdef FEAT_TERMRESPONSE 605f9cc9f20SBram Moolenaar if (t_colors >= 256 && color == 15 && is_mac_terminal) 606f9cc9f20SBram Moolenaar // Terminal.app has a bug: 15 is light grey. Use white 607f9cc9f20SBram Moolenaar // from the color cube instead. 608f9cc9f20SBram Moolenaar color = 231; 609f9cc9f20SBram Moolenaar #endif 610f9cc9f20SBram Moolenaar } 611f9cc9f20SBram Moolenaar return color; 612f9cc9f20SBram Moolenaar } 613f9cc9f20SBram Moolenaar 614f9cc9f20SBram Moolenaar /* 615f9cc9f20SBram Moolenaar * Handle the ":highlight .." command. 616f9cc9f20SBram Moolenaar * When using ":hi clear" this is called recursively for each group with 617f9cc9f20SBram Moolenaar * "forceit" and "init" both TRUE. 618f9cc9f20SBram Moolenaar */ 619f9cc9f20SBram Moolenaar void 620f9cc9f20SBram Moolenaar do_highlight( 621f9cc9f20SBram Moolenaar char_u *line, 622f9cc9f20SBram Moolenaar int forceit, 623f9cc9f20SBram Moolenaar int init) // TRUE when called for initializing 624f9cc9f20SBram Moolenaar { 625f9cc9f20SBram Moolenaar char_u *name_end; 626f9cc9f20SBram Moolenaar char_u *p; 627f9cc9f20SBram Moolenaar char_u *linep; 628f9cc9f20SBram Moolenaar char_u *key_start; 629f9cc9f20SBram Moolenaar char_u *arg_start; 630f9cc9f20SBram Moolenaar char_u *key = NULL, *arg = NULL; 631f9cc9f20SBram Moolenaar long i; 632f9cc9f20SBram Moolenaar int off; 633f9cc9f20SBram Moolenaar int len; 634f9cc9f20SBram Moolenaar int attr; 635f9cc9f20SBram Moolenaar int id; 636f9cc9f20SBram Moolenaar int idx; 637f9cc9f20SBram Moolenaar hl_group_T item_before; 638f9cc9f20SBram Moolenaar int did_change = FALSE; 639f9cc9f20SBram Moolenaar int dodefault = FALSE; 640f9cc9f20SBram Moolenaar int doclear = FALSE; 641f9cc9f20SBram Moolenaar int dolink = FALSE; 642f9cc9f20SBram Moolenaar int error = FALSE; 643f9cc9f20SBram Moolenaar int color; 644f9cc9f20SBram Moolenaar int is_normal_group = FALSE; // "Normal" group 645f9cc9f20SBram Moolenaar #ifdef FEAT_TERMINAL 646f9cc9f20SBram Moolenaar int is_terminal_group = FALSE; // "Terminal" group 647f9cc9f20SBram Moolenaar #endif 648f9cc9f20SBram Moolenaar #ifdef FEAT_GUI_X11 649f9cc9f20SBram Moolenaar int is_menu_group = FALSE; // "Menu" group 650f9cc9f20SBram Moolenaar int is_scrollbar_group = FALSE; // "Scrollbar" group 651f9cc9f20SBram Moolenaar int is_tooltip_group = FALSE; // "Tooltip" group 652f9cc9f20SBram Moolenaar int do_colors = FALSE; // need to update colors? 653f9cc9f20SBram Moolenaar #else 654f9cc9f20SBram Moolenaar # define is_menu_group 0 655f9cc9f20SBram Moolenaar # define is_tooltip_group 0 656f9cc9f20SBram Moolenaar #endif 657f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 658f9cc9f20SBram Moolenaar int did_highlight_changed = FALSE; 659f9cc9f20SBram Moolenaar #endif 660f9cc9f20SBram Moolenaar 661f9cc9f20SBram Moolenaar /* 662f9cc9f20SBram Moolenaar * If no argument, list current highlighting. 663f9cc9f20SBram Moolenaar */ 664f9cc9f20SBram Moolenaar if (ends_excmd(*line)) 665f9cc9f20SBram Moolenaar { 666f9cc9f20SBram Moolenaar for (i = 1; i <= highlight_ga.ga_len && !got_int; ++i) 667f9cc9f20SBram Moolenaar // TODO: only call when the group has attributes set 668f9cc9f20SBram Moolenaar highlight_list_one((int)i); 669f9cc9f20SBram Moolenaar return; 670f9cc9f20SBram Moolenaar } 671f9cc9f20SBram Moolenaar 672f9cc9f20SBram Moolenaar /* 673f9cc9f20SBram Moolenaar * Isolate the name. 674f9cc9f20SBram Moolenaar */ 675f9cc9f20SBram Moolenaar name_end = skiptowhite(line); 676f9cc9f20SBram Moolenaar linep = skipwhite(name_end); 677f9cc9f20SBram Moolenaar 678f9cc9f20SBram Moolenaar /* 679f9cc9f20SBram Moolenaar * Check for "default" argument. 680f9cc9f20SBram Moolenaar */ 681f9cc9f20SBram Moolenaar if (STRNCMP(line, "default", name_end - line) == 0) 682f9cc9f20SBram Moolenaar { 683f9cc9f20SBram Moolenaar dodefault = TRUE; 684f9cc9f20SBram Moolenaar line = linep; 685f9cc9f20SBram Moolenaar name_end = skiptowhite(line); 686f9cc9f20SBram Moolenaar linep = skipwhite(name_end); 687f9cc9f20SBram Moolenaar } 688f9cc9f20SBram Moolenaar 689f9cc9f20SBram Moolenaar /* 690f9cc9f20SBram Moolenaar * Check for "clear" or "link" argument. 691f9cc9f20SBram Moolenaar */ 692f9cc9f20SBram Moolenaar if (STRNCMP(line, "clear", name_end - line) == 0) 693f9cc9f20SBram Moolenaar doclear = TRUE; 694f9cc9f20SBram Moolenaar if (STRNCMP(line, "link", name_end - line) == 0) 695f9cc9f20SBram Moolenaar dolink = TRUE; 696f9cc9f20SBram Moolenaar 697f9cc9f20SBram Moolenaar /* 698f9cc9f20SBram Moolenaar * ":highlight {group-name}": list highlighting for one group. 699f9cc9f20SBram Moolenaar */ 700f9cc9f20SBram Moolenaar if (!doclear && !dolink && ends_excmd(*linep)) 701f9cc9f20SBram Moolenaar { 702f9cc9f20SBram Moolenaar id = syn_namen2id(line, (int)(name_end - line)); 703f9cc9f20SBram Moolenaar if (id == 0) 704f9cc9f20SBram Moolenaar semsg(_("E411: highlight group not found: %s"), line); 705f9cc9f20SBram Moolenaar else 706f9cc9f20SBram Moolenaar highlight_list_one(id); 707f9cc9f20SBram Moolenaar return; 708f9cc9f20SBram Moolenaar } 709f9cc9f20SBram Moolenaar 710f9cc9f20SBram Moolenaar /* 711f9cc9f20SBram Moolenaar * Handle ":highlight link {from} {to}" command. 712f9cc9f20SBram Moolenaar */ 713f9cc9f20SBram Moolenaar if (dolink) 714f9cc9f20SBram Moolenaar { 715f9cc9f20SBram Moolenaar char_u *from_start = linep; 716f9cc9f20SBram Moolenaar char_u *from_end; 717f9cc9f20SBram Moolenaar char_u *to_start; 718f9cc9f20SBram Moolenaar char_u *to_end; 719f9cc9f20SBram Moolenaar int from_id; 720f9cc9f20SBram Moolenaar int to_id; 721f9cc9f20SBram Moolenaar 722f9cc9f20SBram Moolenaar from_end = skiptowhite(from_start); 723f9cc9f20SBram Moolenaar to_start = skipwhite(from_end); 724f9cc9f20SBram Moolenaar to_end = skiptowhite(to_start); 725f9cc9f20SBram Moolenaar 726f9cc9f20SBram Moolenaar if (ends_excmd(*from_start) || ends_excmd(*to_start)) 727f9cc9f20SBram Moolenaar { 728f9cc9f20SBram Moolenaar semsg(_("E412: Not enough arguments: \":highlight link %s\""), 729f9cc9f20SBram Moolenaar from_start); 730f9cc9f20SBram Moolenaar return; 731f9cc9f20SBram Moolenaar } 732f9cc9f20SBram Moolenaar 733f9cc9f20SBram Moolenaar if (!ends_excmd(*skipwhite(to_end))) 734f9cc9f20SBram Moolenaar { 735f9cc9f20SBram Moolenaar semsg(_("E413: Too many arguments: \":highlight link %s\""), from_start); 736f9cc9f20SBram Moolenaar return; 737f9cc9f20SBram Moolenaar } 738f9cc9f20SBram Moolenaar 739f9cc9f20SBram Moolenaar from_id = syn_check_group(from_start, (int)(from_end - from_start)); 740f9cc9f20SBram Moolenaar if (STRNCMP(to_start, "NONE", 4) == 0) 741f9cc9f20SBram Moolenaar to_id = 0; 742f9cc9f20SBram Moolenaar else 743f9cc9f20SBram Moolenaar to_id = syn_check_group(to_start, (int)(to_end - to_start)); 744f9cc9f20SBram Moolenaar 745f9cc9f20SBram Moolenaar if (from_id > 0 && (!init || HL_TABLE()[from_id - 1].sg_set == 0)) 746f9cc9f20SBram Moolenaar { 747f9cc9f20SBram Moolenaar /* 748f9cc9f20SBram Moolenaar * Don't allow a link when there already is some highlighting 749f9cc9f20SBram Moolenaar * for the group, unless '!' is used 750f9cc9f20SBram Moolenaar */ 751f9cc9f20SBram Moolenaar if (to_id > 0 && !forceit && !init 752f9cc9f20SBram Moolenaar && hl_has_settings(from_id - 1, dodefault)) 753f9cc9f20SBram Moolenaar { 754f9cc9f20SBram Moolenaar if (sourcing_name == NULL && !dodefault) 755f9cc9f20SBram Moolenaar emsg(_("E414: group has settings, highlight link ignored")); 756f9cc9f20SBram Moolenaar } 757f9cc9f20SBram Moolenaar else if (HL_TABLE()[from_id - 1].sg_link != to_id 758f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 759f9cc9f20SBram Moolenaar || HL_TABLE()[from_id - 1].sg_script_ctx.sc_sid 760f9cc9f20SBram Moolenaar != current_sctx.sc_sid 761f9cc9f20SBram Moolenaar #endif 762f9cc9f20SBram Moolenaar || HL_TABLE()[from_id - 1].sg_cleared) 763f9cc9f20SBram Moolenaar { 764f9cc9f20SBram Moolenaar if (!init) 765f9cc9f20SBram Moolenaar HL_TABLE()[from_id - 1].sg_set |= SG_LINK; 766f9cc9f20SBram Moolenaar HL_TABLE()[from_id - 1].sg_link = to_id; 767f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 768f9cc9f20SBram Moolenaar HL_TABLE()[from_id - 1].sg_script_ctx = current_sctx; 769f9cc9f20SBram Moolenaar HL_TABLE()[from_id - 1].sg_script_ctx.sc_lnum += sourcing_lnum; 770f9cc9f20SBram Moolenaar #endif 771f9cc9f20SBram Moolenaar HL_TABLE()[from_id - 1].sg_cleared = FALSE; 772f9cc9f20SBram Moolenaar redraw_all_later(SOME_VALID); 773f9cc9f20SBram Moolenaar 774f9cc9f20SBram Moolenaar // Only call highlight_changed() once after multiple changes. 775f9cc9f20SBram Moolenaar need_highlight_changed = TRUE; 776f9cc9f20SBram Moolenaar } 777f9cc9f20SBram Moolenaar } 778f9cc9f20SBram Moolenaar 779f9cc9f20SBram Moolenaar return; 780f9cc9f20SBram Moolenaar } 781f9cc9f20SBram Moolenaar 782f9cc9f20SBram Moolenaar if (doclear) 783f9cc9f20SBram Moolenaar { 784f9cc9f20SBram Moolenaar /* 785f9cc9f20SBram Moolenaar * ":highlight clear [group]" command. 786f9cc9f20SBram Moolenaar */ 787f9cc9f20SBram Moolenaar line = linep; 788f9cc9f20SBram Moolenaar if (ends_excmd(*line)) 789f9cc9f20SBram Moolenaar { 790f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 791f9cc9f20SBram Moolenaar // First, we do not destroy the old values, but allocate the new 792f9cc9f20SBram Moolenaar // ones and update the display. THEN we destroy the old values. 793f9cc9f20SBram Moolenaar // If we destroy the old values first, then the old values 794f9cc9f20SBram Moolenaar // (such as GuiFont's or GuiFontset's) will still be displayed but 795f9cc9f20SBram Moolenaar // invalid because they were free'd. 796f9cc9f20SBram Moolenaar if (gui.in_use) 797f9cc9f20SBram Moolenaar { 798f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_TIP 799f9cc9f20SBram Moolenaar gui_init_tooltip_font(); 800f9cc9f20SBram Moolenaar # endif 801f9cc9f20SBram Moolenaar # if defined(FEAT_MENU) && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF)) 802f9cc9f20SBram Moolenaar gui_init_menu_font(); 803f9cc9f20SBram Moolenaar # endif 804f9cc9f20SBram Moolenaar } 805f9cc9f20SBram Moolenaar # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_X11) 806f9cc9f20SBram Moolenaar gui_mch_def_colors(); 807f9cc9f20SBram Moolenaar # endif 808f9cc9f20SBram Moolenaar # ifdef FEAT_GUI_X11 809f9cc9f20SBram Moolenaar # ifdef FEAT_MENU 810f9cc9f20SBram Moolenaar 811f9cc9f20SBram Moolenaar // This only needs to be done when there is no Menu highlight 812f9cc9f20SBram Moolenaar // group defined by default, which IS currently the case. 813f9cc9f20SBram Moolenaar gui_mch_new_menu_colors(); 814f9cc9f20SBram Moolenaar # endif 815f9cc9f20SBram Moolenaar if (gui.in_use) 816f9cc9f20SBram Moolenaar { 817f9cc9f20SBram Moolenaar gui_new_scrollbar_colors(); 818f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_GUI 819f9cc9f20SBram Moolenaar gui_mch_new_tooltip_colors(); 820f9cc9f20SBram Moolenaar # endif 821f9cc9f20SBram Moolenaar # ifdef FEAT_MENU 822f9cc9f20SBram Moolenaar gui_mch_new_menu_font(); 823f9cc9f20SBram Moolenaar # endif 824f9cc9f20SBram Moolenaar } 825f9cc9f20SBram Moolenaar # endif 826f9cc9f20SBram Moolenaar 827f9cc9f20SBram Moolenaar // Ok, we're done allocating the new default graphics items. 828f9cc9f20SBram Moolenaar // The screen should already be refreshed at this point. 829f9cc9f20SBram Moolenaar // It is now Ok to clear out the old data. 830f9cc9f20SBram Moolenaar #endif 831f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 832f9cc9f20SBram Moolenaar do_unlet((char_u *)"colors_name", TRUE); 833f9cc9f20SBram Moolenaar #endif 834f9cc9f20SBram Moolenaar restore_cterm_colors(); 835f9cc9f20SBram Moolenaar 836f9cc9f20SBram Moolenaar /* 837f9cc9f20SBram Moolenaar * Clear all default highlight groups and load the defaults. 838f9cc9f20SBram Moolenaar */ 839f9cc9f20SBram Moolenaar for (idx = 0; idx < highlight_ga.ga_len; ++idx) 840f9cc9f20SBram Moolenaar highlight_clear(idx); 841f9cc9f20SBram Moolenaar init_highlight(TRUE, TRUE); 842f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 843f9cc9f20SBram Moolenaar if (USE_24BIT) 844f9cc9f20SBram Moolenaar highlight_gui_started(); 845f9cc9f20SBram Moolenaar else 846f9cc9f20SBram Moolenaar #endif 847f9cc9f20SBram Moolenaar highlight_changed(); 848f9cc9f20SBram Moolenaar redraw_later_clear(); 849f9cc9f20SBram Moolenaar return; 850f9cc9f20SBram Moolenaar } 851f9cc9f20SBram Moolenaar name_end = skiptowhite(line); 852f9cc9f20SBram Moolenaar linep = skipwhite(name_end); 853f9cc9f20SBram Moolenaar } 854f9cc9f20SBram Moolenaar 855f9cc9f20SBram Moolenaar /* 856f9cc9f20SBram Moolenaar * Find the group name in the table. If it does not exist yet, add it. 857f9cc9f20SBram Moolenaar */ 858f9cc9f20SBram Moolenaar id = syn_check_group(line, (int)(name_end - line)); 859f9cc9f20SBram Moolenaar if (id == 0) // failed (out of memory) 860f9cc9f20SBram Moolenaar return; 861f9cc9f20SBram Moolenaar idx = id - 1; // index is ID minus one 862f9cc9f20SBram Moolenaar 863f9cc9f20SBram Moolenaar // Return if "default" was used and the group already has settings. 864f9cc9f20SBram Moolenaar if (dodefault && hl_has_settings(idx, TRUE)) 865f9cc9f20SBram Moolenaar return; 866f9cc9f20SBram Moolenaar 867f9cc9f20SBram Moolenaar // Make a copy so we can check if any attribute actually changed. 868f9cc9f20SBram Moolenaar item_before = HL_TABLE()[idx]; 869f9cc9f20SBram Moolenaar 870f9cc9f20SBram Moolenaar if (STRCMP(HL_TABLE()[idx].sg_name_u, "NORMAL") == 0) 871f9cc9f20SBram Moolenaar is_normal_group = TRUE; 872f9cc9f20SBram Moolenaar #ifdef FEAT_TERMINAL 873f9cc9f20SBram Moolenaar else if (STRCMP(HL_TABLE()[idx].sg_name_u, "TERMINAL") == 0) 874f9cc9f20SBram Moolenaar is_terminal_group = TRUE; 875f9cc9f20SBram Moolenaar #endif 876f9cc9f20SBram Moolenaar #ifdef FEAT_GUI_X11 877f9cc9f20SBram Moolenaar else if (STRCMP(HL_TABLE()[idx].sg_name_u, "MENU") == 0) 878f9cc9f20SBram Moolenaar is_menu_group = TRUE; 879f9cc9f20SBram Moolenaar else if (STRCMP(HL_TABLE()[idx].sg_name_u, "SCROLLBAR") == 0) 880f9cc9f20SBram Moolenaar is_scrollbar_group = TRUE; 881f9cc9f20SBram Moolenaar else if (STRCMP(HL_TABLE()[idx].sg_name_u, "TOOLTIP") == 0) 882f9cc9f20SBram Moolenaar is_tooltip_group = TRUE; 883f9cc9f20SBram Moolenaar #endif 884f9cc9f20SBram Moolenaar 885f9cc9f20SBram Moolenaar // Clear the highlighting for ":hi clear {group}" and ":hi clear". 886f9cc9f20SBram Moolenaar if (doclear || (forceit && init)) 887f9cc9f20SBram Moolenaar { 888f9cc9f20SBram Moolenaar highlight_clear(idx); 889f9cc9f20SBram Moolenaar if (!doclear) 890f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set = 0; 891f9cc9f20SBram Moolenaar } 892f9cc9f20SBram Moolenaar 893f9cc9f20SBram Moolenaar if (!doclear) 894f9cc9f20SBram Moolenaar while (!ends_excmd(*linep)) 895f9cc9f20SBram Moolenaar { 896f9cc9f20SBram Moolenaar key_start = linep; 897f9cc9f20SBram Moolenaar if (*linep == '=') 898f9cc9f20SBram Moolenaar { 899f9cc9f20SBram Moolenaar semsg(_("E415: unexpected equal sign: %s"), key_start); 900f9cc9f20SBram Moolenaar error = TRUE; 901f9cc9f20SBram Moolenaar break; 902f9cc9f20SBram Moolenaar } 903f9cc9f20SBram Moolenaar 904f9cc9f20SBram Moolenaar /* 905f9cc9f20SBram Moolenaar * Isolate the key ("term", "ctermfg", "ctermbg", "font", "guifg" or 906f9cc9f20SBram Moolenaar * "guibg"). 907f9cc9f20SBram Moolenaar */ 908f9cc9f20SBram Moolenaar while (*linep && !VIM_ISWHITE(*linep) && *linep != '=') 909f9cc9f20SBram Moolenaar ++linep; 910f9cc9f20SBram Moolenaar vim_free(key); 911f9cc9f20SBram Moolenaar key = vim_strnsave_up(key_start, (int)(linep - key_start)); 912f9cc9f20SBram Moolenaar if (key == NULL) 913f9cc9f20SBram Moolenaar { 914f9cc9f20SBram Moolenaar error = TRUE; 915f9cc9f20SBram Moolenaar break; 916f9cc9f20SBram Moolenaar } 917f9cc9f20SBram Moolenaar linep = skipwhite(linep); 918f9cc9f20SBram Moolenaar 919f9cc9f20SBram Moolenaar if (STRCMP(key, "NONE") == 0) 920f9cc9f20SBram Moolenaar { 921f9cc9f20SBram Moolenaar if (!init || HL_TABLE()[idx].sg_set == 0) 922f9cc9f20SBram Moolenaar { 923f9cc9f20SBram Moolenaar if (!init) 924f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_TERM+SG_CTERM+SG_GUI; 925f9cc9f20SBram Moolenaar highlight_clear(idx); 926f9cc9f20SBram Moolenaar } 927f9cc9f20SBram Moolenaar continue; 928f9cc9f20SBram Moolenaar } 929f9cc9f20SBram Moolenaar 930f9cc9f20SBram Moolenaar /* 931f9cc9f20SBram Moolenaar * Check for the equal sign. 932f9cc9f20SBram Moolenaar */ 933f9cc9f20SBram Moolenaar if (*linep != '=') 934f9cc9f20SBram Moolenaar { 935f9cc9f20SBram Moolenaar semsg(_("E416: missing equal sign: %s"), key_start); 936f9cc9f20SBram Moolenaar error = TRUE; 937f9cc9f20SBram Moolenaar break; 938f9cc9f20SBram Moolenaar } 939f9cc9f20SBram Moolenaar ++linep; 940f9cc9f20SBram Moolenaar 941f9cc9f20SBram Moolenaar /* 942f9cc9f20SBram Moolenaar * Isolate the argument. 943f9cc9f20SBram Moolenaar */ 944f9cc9f20SBram Moolenaar linep = skipwhite(linep); 945f9cc9f20SBram Moolenaar if (*linep == '\'') // guifg='color name' 946f9cc9f20SBram Moolenaar { 947f9cc9f20SBram Moolenaar arg_start = ++linep; 948f9cc9f20SBram Moolenaar linep = vim_strchr(linep, '\''); 949f9cc9f20SBram Moolenaar if (linep == NULL) 950f9cc9f20SBram Moolenaar { 951f9cc9f20SBram Moolenaar semsg(_(e_invarg2), key_start); 952f9cc9f20SBram Moolenaar error = TRUE; 953f9cc9f20SBram Moolenaar break; 954f9cc9f20SBram Moolenaar } 955f9cc9f20SBram Moolenaar } 956f9cc9f20SBram Moolenaar else 957f9cc9f20SBram Moolenaar { 958f9cc9f20SBram Moolenaar arg_start = linep; 959f9cc9f20SBram Moolenaar linep = skiptowhite(linep); 960f9cc9f20SBram Moolenaar } 961f9cc9f20SBram Moolenaar if (linep == arg_start) 962f9cc9f20SBram Moolenaar { 963f9cc9f20SBram Moolenaar semsg(_("E417: missing argument: %s"), key_start); 964f9cc9f20SBram Moolenaar error = TRUE; 965f9cc9f20SBram Moolenaar break; 966f9cc9f20SBram Moolenaar } 967f9cc9f20SBram Moolenaar vim_free(arg); 968f9cc9f20SBram Moolenaar arg = vim_strnsave(arg_start, (int)(linep - arg_start)); 969f9cc9f20SBram Moolenaar if (arg == NULL) 970f9cc9f20SBram Moolenaar { 971f9cc9f20SBram Moolenaar error = TRUE; 972f9cc9f20SBram Moolenaar break; 973f9cc9f20SBram Moolenaar } 974f9cc9f20SBram Moolenaar if (*linep == '\'') 975f9cc9f20SBram Moolenaar ++linep; 976f9cc9f20SBram Moolenaar 977f9cc9f20SBram Moolenaar /* 978f9cc9f20SBram Moolenaar * Store the argument. 979f9cc9f20SBram Moolenaar */ 980f9cc9f20SBram Moolenaar if ( STRCMP(key, "TERM") == 0 981f9cc9f20SBram Moolenaar || STRCMP(key, "CTERM") == 0 982f9cc9f20SBram Moolenaar || STRCMP(key, "GUI") == 0) 983f9cc9f20SBram Moolenaar { 984f9cc9f20SBram Moolenaar attr = 0; 985f9cc9f20SBram Moolenaar off = 0; 986f9cc9f20SBram Moolenaar while (arg[off] != NUL) 987f9cc9f20SBram Moolenaar { 988f9cc9f20SBram Moolenaar for (i = sizeof(hl_attr_table) / sizeof(int); --i >= 0; ) 989f9cc9f20SBram Moolenaar { 990f9cc9f20SBram Moolenaar len = (int)STRLEN(hl_name_table[i]); 991f9cc9f20SBram Moolenaar if (STRNICMP(arg + off, hl_name_table[i], len) == 0) 992f9cc9f20SBram Moolenaar { 993f9cc9f20SBram Moolenaar attr |= hl_attr_table[i]; 994f9cc9f20SBram Moolenaar off += len; 995f9cc9f20SBram Moolenaar break; 996f9cc9f20SBram Moolenaar } 997f9cc9f20SBram Moolenaar } 998f9cc9f20SBram Moolenaar if (i < 0) 999f9cc9f20SBram Moolenaar { 1000f9cc9f20SBram Moolenaar semsg(_("E418: Illegal value: %s"), arg); 1001f9cc9f20SBram Moolenaar error = TRUE; 1002f9cc9f20SBram Moolenaar break; 1003f9cc9f20SBram Moolenaar } 1004f9cc9f20SBram Moolenaar if (arg[off] == ',') // another one follows 1005f9cc9f20SBram Moolenaar ++off; 1006f9cc9f20SBram Moolenaar } 1007f9cc9f20SBram Moolenaar if (error) 1008f9cc9f20SBram Moolenaar break; 1009f9cc9f20SBram Moolenaar if (*key == 'T') 1010f9cc9f20SBram Moolenaar { 1011f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_TERM)) 1012f9cc9f20SBram Moolenaar { 1013f9cc9f20SBram Moolenaar if (!init) 1014f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_TERM; 1015f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_term = attr; 1016f9cc9f20SBram Moolenaar } 1017f9cc9f20SBram Moolenaar } 1018f9cc9f20SBram Moolenaar else if (*key == 'C') 1019f9cc9f20SBram Moolenaar { 1020f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_CTERM)) 1021f9cc9f20SBram Moolenaar { 1022f9cc9f20SBram Moolenaar if (!init) 1023f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_CTERM; 1024f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm = attr; 1025f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_bold = FALSE; 1026f9cc9f20SBram Moolenaar } 1027f9cc9f20SBram Moolenaar } 1028f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 1029f9cc9f20SBram Moolenaar else 1030f9cc9f20SBram Moolenaar { 1031f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) 1032f9cc9f20SBram Moolenaar { 1033f9cc9f20SBram Moolenaar if (!init) 1034f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_GUI; 1035f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui = attr; 1036f9cc9f20SBram Moolenaar } 1037f9cc9f20SBram Moolenaar } 1038f9cc9f20SBram Moolenaar #endif 1039f9cc9f20SBram Moolenaar } 1040f9cc9f20SBram Moolenaar else if (STRCMP(key, "FONT") == 0) 1041f9cc9f20SBram Moolenaar { 1042f9cc9f20SBram Moolenaar // in non-GUI fonts are simply ignored 1043f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 1044f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_font_name != NULL 1045f9cc9f20SBram Moolenaar && STRCMP(HL_TABLE()[idx].sg_font_name, arg) == 0) 1046f9cc9f20SBram Moolenaar { 1047f9cc9f20SBram Moolenaar // Font name didn't change, ignore. 1048f9cc9f20SBram Moolenaar } 1049f9cc9f20SBram Moolenaar else if (!gui.shell_created) 1050f9cc9f20SBram Moolenaar { 1051f9cc9f20SBram Moolenaar // GUI not started yet, always accept the name. 1052f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[idx].sg_font_name); 1053f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font_name = vim_strsave(arg); 1054f9cc9f20SBram Moolenaar did_change = TRUE; 1055f9cc9f20SBram Moolenaar } 1056f9cc9f20SBram Moolenaar else 1057f9cc9f20SBram Moolenaar { 1058f9cc9f20SBram Moolenaar GuiFont temp_sg_font = HL_TABLE()[idx].sg_font; 1059f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 1060f9cc9f20SBram Moolenaar GuiFontset temp_sg_fontset = HL_TABLE()[idx].sg_fontset; 1061f9cc9f20SBram Moolenaar # endif 1062f9cc9f20SBram Moolenaar // First, save the current font/fontset. 1063f9cc9f20SBram Moolenaar // Then try to allocate the font/fontset. 1064f9cc9f20SBram Moolenaar // If the allocation fails, HL_TABLE()[idx].sg_font OR 1065f9cc9f20SBram Moolenaar // sg_fontset will be set to NOFONT or NOFONTSET respectively. 1066f9cc9f20SBram Moolenaar 1067f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font = NOFONT; 1068f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 1069f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_fontset = NOFONTSET; 1070f9cc9f20SBram Moolenaar # endif 1071f9cc9f20SBram Moolenaar hl_do_font(idx, arg, is_normal_group, is_menu_group, 1072f9cc9f20SBram Moolenaar is_tooltip_group, FALSE); 1073f9cc9f20SBram Moolenaar 1074f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 1075f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_fontset != NOFONTSET) 1076f9cc9f20SBram Moolenaar { 1077f9cc9f20SBram Moolenaar // New fontset was accepted. Free the old one, if there 1078f9cc9f20SBram Moolenaar // was one. 1079f9cc9f20SBram Moolenaar gui_mch_free_fontset(temp_sg_fontset); 1080f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[idx].sg_font_name); 1081f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font_name = vim_strsave(arg); 1082f9cc9f20SBram Moolenaar did_change = TRUE; 1083f9cc9f20SBram Moolenaar } 1084f9cc9f20SBram Moolenaar else 1085f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_fontset = temp_sg_fontset; 1086f9cc9f20SBram Moolenaar # endif 1087f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_font != NOFONT) 1088f9cc9f20SBram Moolenaar { 1089f9cc9f20SBram Moolenaar // New font was accepted. Free the old one, if there was 1090f9cc9f20SBram Moolenaar // one. 1091f9cc9f20SBram Moolenaar gui_mch_free_font(temp_sg_font); 1092f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[idx].sg_font_name); 1093f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font_name = vim_strsave(arg); 1094f9cc9f20SBram Moolenaar did_change = TRUE; 1095f9cc9f20SBram Moolenaar } 1096f9cc9f20SBram Moolenaar else 1097f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font = temp_sg_font; 1098f9cc9f20SBram Moolenaar } 1099f9cc9f20SBram Moolenaar #endif 1100f9cc9f20SBram Moolenaar } 1101f9cc9f20SBram Moolenaar else if (STRCMP(key, "CTERMFG") == 0 || STRCMP(key, "CTERMBG") == 0) 1102f9cc9f20SBram Moolenaar { 1103f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_CTERM)) 1104f9cc9f20SBram Moolenaar { 1105f9cc9f20SBram Moolenaar if (!init) 1106f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_CTERM; 1107f9cc9f20SBram Moolenaar 1108f9cc9f20SBram Moolenaar // When setting the foreground color, and previously the "bold" 1109f9cc9f20SBram Moolenaar // flag was set for a light color, reset it now 1110f9cc9f20SBram Moolenaar if (key[5] == 'F' && HL_TABLE()[idx].sg_cterm_bold) 1111f9cc9f20SBram Moolenaar { 1112f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm &= ~HL_BOLD; 1113f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_bold = FALSE; 1114f9cc9f20SBram Moolenaar } 1115f9cc9f20SBram Moolenaar 1116f9cc9f20SBram Moolenaar if (VIM_ISDIGIT(*arg)) 1117f9cc9f20SBram Moolenaar color = atoi((char *)arg); 1118f9cc9f20SBram Moolenaar else if (STRICMP(arg, "fg") == 0) 1119f9cc9f20SBram Moolenaar { 1120f9cc9f20SBram Moolenaar if (cterm_normal_fg_color) 1121f9cc9f20SBram Moolenaar color = cterm_normal_fg_color - 1; 1122f9cc9f20SBram Moolenaar else 1123f9cc9f20SBram Moolenaar { 1124f9cc9f20SBram Moolenaar emsg(_("E419: FG color unknown")); 1125f9cc9f20SBram Moolenaar error = TRUE; 1126f9cc9f20SBram Moolenaar break; 1127f9cc9f20SBram Moolenaar } 1128f9cc9f20SBram Moolenaar } 1129f9cc9f20SBram Moolenaar else if (STRICMP(arg, "bg") == 0) 1130f9cc9f20SBram Moolenaar { 1131f9cc9f20SBram Moolenaar if (cterm_normal_bg_color > 0) 1132f9cc9f20SBram Moolenaar color = cterm_normal_bg_color - 1; 1133f9cc9f20SBram Moolenaar else 1134f9cc9f20SBram Moolenaar { 1135f9cc9f20SBram Moolenaar emsg(_("E420: BG color unknown")); 1136f9cc9f20SBram Moolenaar error = TRUE; 1137f9cc9f20SBram Moolenaar break; 1138f9cc9f20SBram Moolenaar } 1139f9cc9f20SBram Moolenaar } 1140f9cc9f20SBram Moolenaar else 1141f9cc9f20SBram Moolenaar { 1142f9cc9f20SBram Moolenaar int bold = MAYBE; 1143f9cc9f20SBram Moolenaar 1144f9cc9f20SBram Moolenaar #if defined(__QNXNTO__) 1145f9cc9f20SBram Moolenaar static int *color_numbers_8_qansi = color_numbers_8; 1146f9cc9f20SBram Moolenaar // On qnx, the 8 & 16 color arrays are the same 1147f9cc9f20SBram Moolenaar if (STRNCMP(T_NAME, "qansi", 5) == 0) 1148f9cc9f20SBram Moolenaar color_numbers_8_qansi = color_numbers_16; 1149f9cc9f20SBram Moolenaar #endif 1150f9cc9f20SBram Moolenaar 1151f9cc9f20SBram Moolenaar // reduce calls to STRICMP a bit, it can be slow 1152f9cc9f20SBram Moolenaar off = TOUPPER_ASC(*arg); 1153f9cc9f20SBram Moolenaar for (i = (sizeof(color_names) / sizeof(char *)); --i >= 0; ) 1154f9cc9f20SBram Moolenaar if (off == color_names[i][0] 1155f9cc9f20SBram Moolenaar && STRICMP(arg + 1, color_names[i] + 1) == 0) 1156f9cc9f20SBram Moolenaar break; 1157f9cc9f20SBram Moolenaar if (i < 0) 1158f9cc9f20SBram Moolenaar { 1159f9cc9f20SBram Moolenaar semsg(_("E421: Color name or number not recognized: %s"), key_start); 1160f9cc9f20SBram Moolenaar error = TRUE; 1161f9cc9f20SBram Moolenaar break; 1162f9cc9f20SBram Moolenaar } 1163f9cc9f20SBram Moolenaar 1164f9cc9f20SBram Moolenaar color = lookup_color(i, key[5] == 'F', &bold); 1165f9cc9f20SBram Moolenaar 1166f9cc9f20SBram Moolenaar // set/reset bold attribute to get light foreground 1167f9cc9f20SBram Moolenaar // colors (on some terminals, e.g. "linux") 1168f9cc9f20SBram Moolenaar if (bold == TRUE) 1169f9cc9f20SBram Moolenaar { 1170f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm |= HL_BOLD; 1171f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_bold = TRUE; 1172f9cc9f20SBram Moolenaar } 1173f9cc9f20SBram Moolenaar else if (bold == FALSE) 1174f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm &= ~HL_BOLD; 1175f9cc9f20SBram Moolenaar } 1176f9cc9f20SBram Moolenaar 1177f9cc9f20SBram Moolenaar // Add one to the argument, to avoid zero. Zero is used for 1178f9cc9f20SBram Moolenaar // "NONE", then "color" is -1. 1179f9cc9f20SBram Moolenaar if (key[5] == 'F') 1180f9cc9f20SBram Moolenaar { 1181f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_fg = color + 1; 1182f9cc9f20SBram Moolenaar if (is_normal_group) 1183f9cc9f20SBram Moolenaar { 1184f9cc9f20SBram Moolenaar cterm_normal_fg_color = color + 1; 1185f9cc9f20SBram Moolenaar cterm_normal_fg_bold = (HL_TABLE()[idx].sg_cterm & HL_BOLD); 1186f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 1187f9cc9f20SBram Moolenaar // Don't do this if the GUI is used. 1188f9cc9f20SBram Moolenaar if (!gui.in_use && !gui.starting) 1189f9cc9f20SBram Moolenaar #endif 1190f9cc9f20SBram Moolenaar { 1191f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1192f9cc9f20SBram Moolenaar if (termcap_active && color >= 0) 1193f9cc9f20SBram Moolenaar term_fg_color(color); 1194f9cc9f20SBram Moolenaar } 1195f9cc9f20SBram Moolenaar } 1196f9cc9f20SBram Moolenaar } 1197f9cc9f20SBram Moolenaar else 1198f9cc9f20SBram Moolenaar { 1199f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_bg = color + 1; 1200f9cc9f20SBram Moolenaar if (is_normal_group) 1201f9cc9f20SBram Moolenaar { 1202f9cc9f20SBram Moolenaar cterm_normal_bg_color = color + 1; 1203f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 1204f9cc9f20SBram Moolenaar // Don't mess with 'background' if the GUI is used. 1205f9cc9f20SBram Moolenaar if (!gui.in_use && !gui.starting) 1206f9cc9f20SBram Moolenaar #endif 1207f9cc9f20SBram Moolenaar { 1208f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1209f9cc9f20SBram Moolenaar if (color >= 0) 1210f9cc9f20SBram Moolenaar { 1211f9cc9f20SBram Moolenaar int dark = -1; 1212f9cc9f20SBram Moolenaar 1213f9cc9f20SBram Moolenaar if (termcap_active) 1214f9cc9f20SBram Moolenaar term_bg_color(color); 1215f9cc9f20SBram Moolenaar if (t_colors < 16) 1216f9cc9f20SBram Moolenaar dark = (color == 0 || color == 4); 1217f9cc9f20SBram Moolenaar // Limit the heuristic to the standard 16 colors 1218f9cc9f20SBram Moolenaar else if (color < 16) 1219f9cc9f20SBram Moolenaar dark = (color < 7 || color == 8); 1220f9cc9f20SBram Moolenaar // Set the 'background' option if the value is 1221f9cc9f20SBram Moolenaar // wrong. 1222f9cc9f20SBram Moolenaar if (dark != -1 1223f9cc9f20SBram Moolenaar && dark != (*p_bg == 'd') 1224f9cc9f20SBram Moolenaar && !option_was_set((char_u *)"bg")) 1225f9cc9f20SBram Moolenaar { 1226f9cc9f20SBram Moolenaar set_option_value((char_u *)"bg", 0L, 1227f9cc9f20SBram Moolenaar (char_u *)(dark ? "dark" : "light"), 0); 1228f9cc9f20SBram Moolenaar reset_option_was_set((char_u *)"bg"); 1229f9cc9f20SBram Moolenaar } 1230f9cc9f20SBram Moolenaar } 1231f9cc9f20SBram Moolenaar } 1232f9cc9f20SBram Moolenaar } 1233f9cc9f20SBram Moolenaar } 1234f9cc9f20SBram Moolenaar } 1235f9cc9f20SBram Moolenaar } 1236f9cc9f20SBram Moolenaar else if (STRCMP(key, "GUIFG") == 0) 1237f9cc9f20SBram Moolenaar { 1238f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 1239f9cc9f20SBram Moolenaar char_u **namep = &HL_TABLE()[idx].sg_gui_fg_name; 1240f9cc9f20SBram Moolenaar 1241f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) 1242f9cc9f20SBram Moolenaar { 1243f9cc9f20SBram Moolenaar if (!init) 1244f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_GUI; 1245f9cc9f20SBram Moolenaar 1246f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1247f9cc9f20SBram Moolenaar // In GUI guifg colors are only used when recognized 1248f9cc9f20SBram Moolenaar i = color_name2handle(arg); 1249f9cc9f20SBram Moolenaar if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !USE_24BIT) 1250f9cc9f20SBram Moolenaar { 1251f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_fg = i; 1252f9cc9f20SBram Moolenaar # endif 1253f9cc9f20SBram Moolenaar if (*namep == NULL || STRCMP(*namep, arg) != 0) 1254f9cc9f20SBram Moolenaar { 1255f9cc9f20SBram Moolenaar vim_free(*namep); 1256f9cc9f20SBram Moolenaar if (STRCMP(arg, "NONE") != 0) 1257f9cc9f20SBram Moolenaar *namep = vim_strsave(arg); 1258f9cc9f20SBram Moolenaar else 1259f9cc9f20SBram Moolenaar *namep = NULL; 1260f9cc9f20SBram Moolenaar did_change = TRUE; 1261f9cc9f20SBram Moolenaar } 1262f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1263f9cc9f20SBram Moolenaar # ifdef FEAT_GUI_X11 1264f9cc9f20SBram Moolenaar if (is_menu_group && gui.menu_fg_pixel != i) 1265f9cc9f20SBram Moolenaar { 1266f9cc9f20SBram Moolenaar gui.menu_fg_pixel = i; 1267f9cc9f20SBram Moolenaar do_colors = TRUE; 1268f9cc9f20SBram Moolenaar } 1269f9cc9f20SBram Moolenaar if (is_scrollbar_group && gui.scroll_fg_pixel != i) 1270f9cc9f20SBram Moolenaar { 1271f9cc9f20SBram Moolenaar gui.scroll_fg_pixel = i; 1272f9cc9f20SBram Moolenaar do_colors = TRUE; 1273f9cc9f20SBram Moolenaar } 1274f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_GUI 1275f9cc9f20SBram Moolenaar if (is_tooltip_group && gui.tooltip_fg_pixel != i) 1276f9cc9f20SBram Moolenaar { 1277f9cc9f20SBram Moolenaar gui.tooltip_fg_pixel = i; 1278f9cc9f20SBram Moolenaar do_colors = TRUE; 1279f9cc9f20SBram Moolenaar } 1280f9cc9f20SBram Moolenaar # endif 1281f9cc9f20SBram Moolenaar # endif 1282f9cc9f20SBram Moolenaar } 1283f9cc9f20SBram Moolenaar # endif 1284f9cc9f20SBram Moolenaar } 1285f9cc9f20SBram Moolenaar #endif 1286f9cc9f20SBram Moolenaar } 1287f9cc9f20SBram Moolenaar else if (STRCMP(key, "GUIBG") == 0) 1288f9cc9f20SBram Moolenaar { 1289f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 1290f9cc9f20SBram Moolenaar char_u **namep = &HL_TABLE()[idx].sg_gui_bg_name; 1291f9cc9f20SBram Moolenaar 1292f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) 1293f9cc9f20SBram Moolenaar { 1294f9cc9f20SBram Moolenaar if (!init) 1295f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_GUI; 1296f9cc9f20SBram Moolenaar 1297f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1298f9cc9f20SBram Moolenaar // In GUI guifg colors are only used when recognized 1299f9cc9f20SBram Moolenaar i = color_name2handle(arg); 1300f9cc9f20SBram Moolenaar if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !USE_24BIT) 1301f9cc9f20SBram Moolenaar { 1302f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_bg = i; 1303f9cc9f20SBram Moolenaar # endif 1304f9cc9f20SBram Moolenaar if (*namep == NULL || STRCMP(*namep, arg) != 0) 1305f9cc9f20SBram Moolenaar { 1306f9cc9f20SBram Moolenaar vim_free(*namep); 1307f9cc9f20SBram Moolenaar if (STRCMP(arg, "NONE") != 0) 1308f9cc9f20SBram Moolenaar *namep = vim_strsave(arg); 1309f9cc9f20SBram Moolenaar else 1310f9cc9f20SBram Moolenaar *namep = NULL; 1311f9cc9f20SBram Moolenaar did_change = TRUE; 1312f9cc9f20SBram Moolenaar } 1313f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1314f9cc9f20SBram Moolenaar # ifdef FEAT_GUI_X11 1315f9cc9f20SBram Moolenaar if (is_menu_group && gui.menu_bg_pixel != i) 1316f9cc9f20SBram Moolenaar { 1317f9cc9f20SBram Moolenaar gui.menu_bg_pixel = i; 1318f9cc9f20SBram Moolenaar do_colors = TRUE; 1319f9cc9f20SBram Moolenaar } 1320f9cc9f20SBram Moolenaar if (is_scrollbar_group && gui.scroll_bg_pixel != i) 1321f9cc9f20SBram Moolenaar { 1322f9cc9f20SBram Moolenaar gui.scroll_bg_pixel = i; 1323f9cc9f20SBram Moolenaar do_colors = TRUE; 1324f9cc9f20SBram Moolenaar } 1325f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_GUI 1326f9cc9f20SBram Moolenaar if (is_tooltip_group && gui.tooltip_bg_pixel != i) 1327f9cc9f20SBram Moolenaar { 1328f9cc9f20SBram Moolenaar gui.tooltip_bg_pixel = i; 1329f9cc9f20SBram Moolenaar do_colors = TRUE; 1330f9cc9f20SBram Moolenaar } 1331f9cc9f20SBram Moolenaar # endif 1332f9cc9f20SBram Moolenaar # endif 1333f9cc9f20SBram Moolenaar } 1334f9cc9f20SBram Moolenaar # endif 1335f9cc9f20SBram Moolenaar } 1336f9cc9f20SBram Moolenaar #endif 1337f9cc9f20SBram Moolenaar } 1338f9cc9f20SBram Moolenaar else if (STRCMP(key, "GUISP") == 0) 1339f9cc9f20SBram Moolenaar { 1340f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 1341f9cc9f20SBram Moolenaar char_u **namep = &HL_TABLE()[idx].sg_gui_sp_name; 1342f9cc9f20SBram Moolenaar 1343f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI)) 1344f9cc9f20SBram Moolenaar { 1345f9cc9f20SBram Moolenaar if (!init) 1346f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_GUI; 1347f9cc9f20SBram Moolenaar 1348f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 1349f9cc9f20SBram Moolenaar i = color_name2handle(arg); 1350f9cc9f20SBram Moolenaar if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use) 1351f9cc9f20SBram Moolenaar { 1352f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_sp = i; 1353f9cc9f20SBram Moolenaar # endif 1354f9cc9f20SBram Moolenaar if (*namep == NULL || STRCMP(*namep, arg) != 0) 1355f9cc9f20SBram Moolenaar { 1356f9cc9f20SBram Moolenaar vim_free(*namep); 1357f9cc9f20SBram Moolenaar if (STRCMP(arg, "NONE") != 0) 1358f9cc9f20SBram Moolenaar *namep = vim_strsave(arg); 1359f9cc9f20SBram Moolenaar else 1360f9cc9f20SBram Moolenaar *namep = NULL; 1361f9cc9f20SBram Moolenaar did_change = TRUE; 1362f9cc9f20SBram Moolenaar } 1363f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 1364f9cc9f20SBram Moolenaar } 1365f9cc9f20SBram Moolenaar # endif 1366f9cc9f20SBram Moolenaar } 1367f9cc9f20SBram Moolenaar #endif 1368f9cc9f20SBram Moolenaar } 1369f9cc9f20SBram Moolenaar else if (STRCMP(key, "START") == 0 || STRCMP(key, "STOP") == 0) 1370f9cc9f20SBram Moolenaar { 1371f9cc9f20SBram Moolenaar char_u buf[100]; 1372f9cc9f20SBram Moolenaar char_u *tname; 1373f9cc9f20SBram Moolenaar 1374f9cc9f20SBram Moolenaar if (!init) 1375f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_set |= SG_TERM; 1376f9cc9f20SBram Moolenaar 1377f9cc9f20SBram Moolenaar /* 1378f9cc9f20SBram Moolenaar * The "start" and "stop" arguments can be a literal escape 1379f9cc9f20SBram Moolenaar * sequence, or a comma separated list of terminal codes. 1380f9cc9f20SBram Moolenaar */ 1381f9cc9f20SBram Moolenaar if (STRNCMP(arg, "t_", 2) == 0) 1382f9cc9f20SBram Moolenaar { 1383f9cc9f20SBram Moolenaar off = 0; 1384f9cc9f20SBram Moolenaar buf[0] = 0; 1385f9cc9f20SBram Moolenaar while (arg[off] != NUL) 1386f9cc9f20SBram Moolenaar { 1387f9cc9f20SBram Moolenaar // Isolate one termcap name 1388f9cc9f20SBram Moolenaar for (len = 0; arg[off + len] && 1389f9cc9f20SBram Moolenaar arg[off + len] != ','; ++len) 1390f9cc9f20SBram Moolenaar ; 1391f9cc9f20SBram Moolenaar tname = vim_strnsave(arg + off, len); 1392f9cc9f20SBram Moolenaar if (tname == NULL) // out of memory 1393f9cc9f20SBram Moolenaar { 1394f9cc9f20SBram Moolenaar error = TRUE; 1395f9cc9f20SBram Moolenaar break; 1396f9cc9f20SBram Moolenaar } 1397f9cc9f20SBram Moolenaar // lookup the escape sequence for the item 1398f9cc9f20SBram Moolenaar p = get_term_code(tname); 1399f9cc9f20SBram Moolenaar vim_free(tname); 1400f9cc9f20SBram Moolenaar if (p == NULL) // ignore non-existing things 1401f9cc9f20SBram Moolenaar p = (char_u *)""; 1402f9cc9f20SBram Moolenaar 1403f9cc9f20SBram Moolenaar // Append it to the already found stuff 1404f9cc9f20SBram Moolenaar if ((int)(STRLEN(buf) + STRLEN(p)) >= 99) 1405f9cc9f20SBram Moolenaar { 1406f9cc9f20SBram Moolenaar semsg(_("E422: terminal code too long: %s"), arg); 1407f9cc9f20SBram Moolenaar error = TRUE; 1408f9cc9f20SBram Moolenaar break; 1409f9cc9f20SBram Moolenaar } 1410f9cc9f20SBram Moolenaar STRCAT(buf, p); 1411f9cc9f20SBram Moolenaar 1412f9cc9f20SBram Moolenaar // Advance to the next item 1413f9cc9f20SBram Moolenaar off += len; 1414f9cc9f20SBram Moolenaar if (arg[off] == ',') // another one follows 1415f9cc9f20SBram Moolenaar ++off; 1416f9cc9f20SBram Moolenaar } 1417f9cc9f20SBram Moolenaar } 1418f9cc9f20SBram Moolenaar else 1419f9cc9f20SBram Moolenaar { 1420f9cc9f20SBram Moolenaar /* 1421f9cc9f20SBram Moolenaar * Copy characters from arg[] to buf[], translating <> codes. 1422f9cc9f20SBram Moolenaar */ 1423f9cc9f20SBram Moolenaar for (p = arg, off = 0; off < 100 - 6 && *p; ) 1424f9cc9f20SBram Moolenaar { 1425f9cc9f20SBram Moolenaar len = trans_special(&p, buf + off, FALSE, FALSE); 1426f9cc9f20SBram Moolenaar if (len > 0) // recognized special char 1427f9cc9f20SBram Moolenaar off += len; 1428f9cc9f20SBram Moolenaar else // copy as normal char 1429f9cc9f20SBram Moolenaar buf[off++] = *p++; 1430f9cc9f20SBram Moolenaar } 1431f9cc9f20SBram Moolenaar buf[off] = NUL; 1432f9cc9f20SBram Moolenaar } 1433f9cc9f20SBram Moolenaar if (error) 1434f9cc9f20SBram Moolenaar break; 1435f9cc9f20SBram Moolenaar 1436f9cc9f20SBram Moolenaar if (STRCMP(buf, "NONE") == 0) // resetting the value 1437f9cc9f20SBram Moolenaar p = NULL; 1438f9cc9f20SBram Moolenaar else 1439f9cc9f20SBram Moolenaar p = vim_strsave(buf); 1440f9cc9f20SBram Moolenaar if (key[2] == 'A') 1441f9cc9f20SBram Moolenaar { 1442f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[idx].sg_start); 1443f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_start = p; 1444f9cc9f20SBram Moolenaar } 1445f9cc9f20SBram Moolenaar else 1446f9cc9f20SBram Moolenaar { 1447f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[idx].sg_stop); 1448f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_stop = p; 1449f9cc9f20SBram Moolenaar } 1450f9cc9f20SBram Moolenaar } 1451f9cc9f20SBram Moolenaar else 1452f9cc9f20SBram Moolenaar { 1453f9cc9f20SBram Moolenaar semsg(_("E423: Illegal argument: %s"), key_start); 1454f9cc9f20SBram Moolenaar error = TRUE; 1455f9cc9f20SBram Moolenaar break; 1456f9cc9f20SBram Moolenaar } 1457f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cleared = FALSE; 1458f9cc9f20SBram Moolenaar 1459f9cc9f20SBram Moolenaar /* 1460f9cc9f20SBram Moolenaar * When highlighting has been given for a group, don't link it. 1461f9cc9f20SBram Moolenaar */ 1462f9cc9f20SBram Moolenaar if (!init || !(HL_TABLE()[idx].sg_set & SG_LINK)) 1463f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_link = 0; 1464f9cc9f20SBram Moolenaar 1465f9cc9f20SBram Moolenaar /* 1466f9cc9f20SBram Moolenaar * Continue with next argument. 1467f9cc9f20SBram Moolenaar */ 1468f9cc9f20SBram Moolenaar linep = skipwhite(linep); 1469f9cc9f20SBram Moolenaar } 1470f9cc9f20SBram Moolenaar 1471f9cc9f20SBram Moolenaar /* 1472f9cc9f20SBram Moolenaar * If there is an error, and it's a new entry, remove it from the table. 1473f9cc9f20SBram Moolenaar */ 1474f9cc9f20SBram Moolenaar if (error && idx == highlight_ga.ga_len) 1475f9cc9f20SBram Moolenaar syn_unadd_group(); 1476f9cc9f20SBram Moolenaar else 1477f9cc9f20SBram Moolenaar { 1478f9cc9f20SBram Moolenaar if (is_normal_group) 1479f9cc9f20SBram Moolenaar { 1480f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_term_attr = 0; 1481f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_attr = 0; 1482f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 1483f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_attr = 0; 1484f9cc9f20SBram Moolenaar /* 1485f9cc9f20SBram Moolenaar * Need to update all groups, because they might be using "bg" 1486f9cc9f20SBram Moolenaar * and/or "fg", which have been changed now. 1487f9cc9f20SBram Moolenaar */ 1488f9cc9f20SBram Moolenaar #endif 1489f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1490f9cc9f20SBram Moolenaar if (USE_24BIT) 1491f9cc9f20SBram Moolenaar { 1492f9cc9f20SBram Moolenaar highlight_gui_started(); 1493f9cc9f20SBram Moolenaar did_highlight_changed = TRUE; 1494f9cc9f20SBram Moolenaar redraw_all_later(NOT_VALID); 1495f9cc9f20SBram Moolenaar } 1496f9cc9f20SBram Moolenaar #endif 1497f9cc9f20SBram Moolenaar } 1498f9cc9f20SBram Moolenaar #ifdef FEAT_TERMINAL 1499f9cc9f20SBram Moolenaar else if (is_terminal_group) 1500f9cc9f20SBram Moolenaar set_terminal_default_colors( 1501f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_fg, HL_TABLE()[idx].sg_cterm_bg); 1502f9cc9f20SBram Moolenaar #endif 1503f9cc9f20SBram Moolenaar #ifdef FEAT_GUI_X11 1504f9cc9f20SBram Moolenaar # ifdef FEAT_MENU 1505f9cc9f20SBram Moolenaar else if (is_menu_group) 1506f9cc9f20SBram Moolenaar { 1507f9cc9f20SBram Moolenaar if (gui.in_use && do_colors) 1508f9cc9f20SBram Moolenaar gui_mch_new_menu_colors(); 1509f9cc9f20SBram Moolenaar } 1510f9cc9f20SBram Moolenaar # endif 1511f9cc9f20SBram Moolenaar else if (is_scrollbar_group) 1512f9cc9f20SBram Moolenaar { 1513f9cc9f20SBram Moolenaar if (gui.in_use && do_colors) 1514f9cc9f20SBram Moolenaar gui_new_scrollbar_colors(); 1515f9cc9f20SBram Moolenaar else 1516f9cc9f20SBram Moolenaar set_hl_attr(idx); 1517f9cc9f20SBram Moolenaar } 1518f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_GUI 1519f9cc9f20SBram Moolenaar else if (is_tooltip_group) 1520f9cc9f20SBram Moolenaar { 1521f9cc9f20SBram Moolenaar if (gui.in_use && do_colors) 1522f9cc9f20SBram Moolenaar gui_mch_new_tooltip_colors(); 1523f9cc9f20SBram Moolenaar } 1524f9cc9f20SBram Moolenaar # endif 1525f9cc9f20SBram Moolenaar #endif 1526f9cc9f20SBram Moolenaar else 1527f9cc9f20SBram Moolenaar set_hl_attr(idx); 1528f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 1529f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_script_ctx = current_sctx; 1530f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_script_ctx.sc_lnum += sourcing_lnum; 1531f9cc9f20SBram Moolenaar #endif 1532f9cc9f20SBram Moolenaar } 1533f9cc9f20SBram Moolenaar 1534f9cc9f20SBram Moolenaar vim_free(key); 1535f9cc9f20SBram Moolenaar vim_free(arg); 1536f9cc9f20SBram Moolenaar 1537f9cc9f20SBram Moolenaar // Only call highlight_changed() once, after a sequence of highlight 1538f9cc9f20SBram Moolenaar // commands, and only if an attribute actually changed. 1539f9cc9f20SBram Moolenaar if ((did_change 1540f9cc9f20SBram Moolenaar || memcmp(&HL_TABLE()[idx], &item_before, sizeof(item_before)) != 0) 1541f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1542f9cc9f20SBram Moolenaar && !did_highlight_changed 1543f9cc9f20SBram Moolenaar #endif 1544f9cc9f20SBram Moolenaar ) 1545f9cc9f20SBram Moolenaar { 1546f9cc9f20SBram Moolenaar // Do not trigger a redraw when highlighting is changed while 1547f9cc9f20SBram Moolenaar // redrawing. This may happen when evaluating 'statusline' changes the 1548f9cc9f20SBram Moolenaar // StatusLine group. 1549f9cc9f20SBram Moolenaar if (!updating_screen) 1550f9cc9f20SBram Moolenaar redraw_all_later(NOT_VALID); 1551f9cc9f20SBram Moolenaar need_highlight_changed = TRUE; 1552f9cc9f20SBram Moolenaar } 1553f9cc9f20SBram Moolenaar } 1554f9cc9f20SBram Moolenaar 1555f9cc9f20SBram Moolenaar #if defined(EXITFREE) || defined(PROTO) 1556f9cc9f20SBram Moolenaar void 1557f9cc9f20SBram Moolenaar free_highlight(void) 1558f9cc9f20SBram Moolenaar { 1559f9cc9f20SBram Moolenaar int i; 1560f9cc9f20SBram Moolenaar 1561f9cc9f20SBram Moolenaar for (i = 0; i < highlight_ga.ga_len; ++i) 1562f9cc9f20SBram Moolenaar { 1563f9cc9f20SBram Moolenaar highlight_clear(i); 1564f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[i].sg_name); 1565f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[i].sg_name_u); 1566f9cc9f20SBram Moolenaar } 1567f9cc9f20SBram Moolenaar ga_clear(&highlight_ga); 1568f9cc9f20SBram Moolenaar } 1569f9cc9f20SBram Moolenaar #endif 1570f9cc9f20SBram Moolenaar 1571f9cc9f20SBram Moolenaar /* 1572f9cc9f20SBram Moolenaar * Reset the cterm colors to what they were before Vim was started, if 1573f9cc9f20SBram Moolenaar * possible. Otherwise reset them to zero. 1574f9cc9f20SBram Moolenaar */ 1575f9cc9f20SBram Moolenaar void 1576f9cc9f20SBram Moolenaar restore_cterm_colors(void) 1577f9cc9f20SBram Moolenaar { 1578f9cc9f20SBram Moolenaar #if defined(MSWIN) && !defined(FEAT_GUI_MSWIN) 1579f9cc9f20SBram Moolenaar // Since t_me has been set, this probably means that the user 1580f9cc9f20SBram Moolenaar // wants to use this as default colors. Need to reset default 1581f9cc9f20SBram Moolenaar // background/foreground colors. 1582f9cc9f20SBram Moolenaar mch_set_normal_colors(); 1583f9cc9f20SBram Moolenaar #else 1584f9cc9f20SBram Moolenaar # ifdef VIMDLL 1585f9cc9f20SBram Moolenaar if (!gui.in_use) 1586f9cc9f20SBram Moolenaar { 1587f9cc9f20SBram Moolenaar mch_set_normal_colors(); 1588f9cc9f20SBram Moolenaar return; 1589f9cc9f20SBram Moolenaar } 1590f9cc9f20SBram Moolenaar # endif 1591f9cc9f20SBram Moolenaar cterm_normal_fg_color = 0; 1592f9cc9f20SBram Moolenaar cterm_normal_fg_bold = 0; 1593f9cc9f20SBram Moolenaar cterm_normal_bg_color = 0; 1594f9cc9f20SBram Moolenaar # ifdef FEAT_TERMGUICOLORS 1595f9cc9f20SBram Moolenaar cterm_normal_fg_gui_color = INVALCOLOR; 1596f9cc9f20SBram Moolenaar cterm_normal_bg_gui_color = INVALCOLOR; 1597f9cc9f20SBram Moolenaar # endif 1598f9cc9f20SBram Moolenaar #endif 1599f9cc9f20SBram Moolenaar } 1600f9cc9f20SBram Moolenaar 1601f9cc9f20SBram Moolenaar /* 1602f9cc9f20SBram Moolenaar * Return TRUE if highlight group "idx" has any settings. 1603f9cc9f20SBram Moolenaar * When "check_link" is TRUE also check for an existing link. 1604f9cc9f20SBram Moolenaar */ 1605f9cc9f20SBram Moolenaar static int 1606f9cc9f20SBram Moolenaar hl_has_settings(int idx, int check_link) 1607f9cc9f20SBram Moolenaar { 1608f9cc9f20SBram Moolenaar return ( HL_TABLE()[idx].sg_term_attr != 0 1609f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_cterm_attr != 0 1610f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_cterm_fg != 0 1611f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_cterm_bg != 0 1612f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 1613f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_gui_attr != 0 1614f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_gui_fg_name != NULL 1615f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_gui_bg_name != NULL 1616f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_gui_sp_name != NULL 1617f9cc9f20SBram Moolenaar || HL_TABLE()[idx].sg_font_name != NULL 1618f9cc9f20SBram Moolenaar #endif 1619f9cc9f20SBram Moolenaar || (check_link && (HL_TABLE()[idx].sg_set & SG_LINK))); 1620f9cc9f20SBram Moolenaar } 1621f9cc9f20SBram Moolenaar 1622f9cc9f20SBram Moolenaar /* 1623f9cc9f20SBram Moolenaar * Clear highlighting for one group. 1624f9cc9f20SBram Moolenaar */ 1625f9cc9f20SBram Moolenaar static void 1626f9cc9f20SBram Moolenaar highlight_clear(int idx) 1627f9cc9f20SBram Moolenaar { 1628f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cleared = TRUE; 1629f9cc9f20SBram Moolenaar 1630f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_term = 0; 1631f9cc9f20SBram Moolenaar VIM_CLEAR(HL_TABLE()[idx].sg_start); 1632f9cc9f20SBram Moolenaar VIM_CLEAR(HL_TABLE()[idx].sg_stop); 1633f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_term_attr = 0; 1634f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm = 0; 1635f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_bold = FALSE; 1636f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_fg = 0; 1637f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_bg = 0; 1638f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_cterm_attr = 0; 1639f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 1640f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui = 0; 1641f9cc9f20SBram Moolenaar VIM_CLEAR(HL_TABLE()[idx].sg_gui_fg_name); 1642f9cc9f20SBram Moolenaar VIM_CLEAR(HL_TABLE()[idx].sg_gui_bg_name); 1643f9cc9f20SBram Moolenaar VIM_CLEAR(HL_TABLE()[idx].sg_gui_sp_name); 1644f9cc9f20SBram Moolenaar #endif 1645f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 1646f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_fg = INVALCOLOR; 1647f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_bg = INVALCOLOR; 1648f9cc9f20SBram Moolenaar #endif 1649f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 1650f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_sp = INVALCOLOR; 1651f9cc9f20SBram Moolenaar gui_mch_free_font(HL_TABLE()[idx].sg_font); 1652f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font = NOFONT; 1653f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 1654f9cc9f20SBram Moolenaar gui_mch_free_fontset(HL_TABLE()[idx].sg_fontset); 1655f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_fontset = NOFONTSET; 1656f9cc9f20SBram Moolenaar # endif 1657f9cc9f20SBram Moolenaar VIM_CLEAR(HL_TABLE()[idx].sg_font_name); 1658f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_attr = 0; 1659f9cc9f20SBram Moolenaar #endif 1660f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 1661f9cc9f20SBram Moolenaar // Clear the script ID only when there is no link, since that is not 1662f9cc9f20SBram Moolenaar // cleared. 1663f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_link == 0) 1664f9cc9f20SBram Moolenaar { 1665f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_script_ctx.sc_sid = 0; 1666f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_script_ctx.sc_lnum = 0; 1667f9cc9f20SBram Moolenaar } 1668f9cc9f20SBram Moolenaar #endif 1669f9cc9f20SBram Moolenaar } 1670f9cc9f20SBram Moolenaar 1671f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) || defined(PROTO) 1672f9cc9f20SBram Moolenaar /* 1673f9cc9f20SBram Moolenaar * Set the normal foreground and background colors according to the "Normal" 1674f9cc9f20SBram Moolenaar * highlighting group. For X11 also set "Menu", "Scrollbar", and 1675f9cc9f20SBram Moolenaar * "Tooltip" colors. 1676f9cc9f20SBram Moolenaar */ 1677f9cc9f20SBram Moolenaar void 1678f9cc9f20SBram Moolenaar set_normal_colors(void) 1679f9cc9f20SBram Moolenaar { 1680f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 1681f9cc9f20SBram Moolenaar # ifdef FEAT_TERMGUICOLORS 1682f9cc9f20SBram Moolenaar if (gui.in_use) 1683f9cc9f20SBram Moolenaar # endif 1684f9cc9f20SBram Moolenaar { 1685f9cc9f20SBram Moolenaar if (set_group_colors((char_u *)"Normal", 1686f9cc9f20SBram Moolenaar &gui.norm_pixel, &gui.back_pixel, 1687f9cc9f20SBram Moolenaar FALSE, TRUE, FALSE)) 1688f9cc9f20SBram Moolenaar { 1689f9cc9f20SBram Moolenaar gui_mch_new_colors(); 1690f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1691f9cc9f20SBram Moolenaar } 1692f9cc9f20SBram Moolenaar # ifdef FEAT_GUI_X11 1693f9cc9f20SBram Moolenaar if (set_group_colors((char_u *)"Menu", 1694f9cc9f20SBram Moolenaar &gui.menu_fg_pixel, &gui.menu_bg_pixel, 1695f9cc9f20SBram Moolenaar TRUE, FALSE, FALSE)) 1696f9cc9f20SBram Moolenaar { 1697f9cc9f20SBram Moolenaar # ifdef FEAT_MENU 1698f9cc9f20SBram Moolenaar gui_mch_new_menu_colors(); 1699f9cc9f20SBram Moolenaar # endif 1700f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1701f9cc9f20SBram Moolenaar } 1702f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_GUI 1703f9cc9f20SBram Moolenaar if (set_group_colors((char_u *)"Tooltip", 1704f9cc9f20SBram Moolenaar &gui.tooltip_fg_pixel, &gui.tooltip_bg_pixel, 1705f9cc9f20SBram Moolenaar FALSE, FALSE, TRUE)) 1706f9cc9f20SBram Moolenaar { 1707f9cc9f20SBram Moolenaar # ifdef FEAT_TOOLBAR 1708f9cc9f20SBram Moolenaar gui_mch_new_tooltip_colors(); 1709f9cc9f20SBram Moolenaar # endif 1710f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1711f9cc9f20SBram Moolenaar } 1712f9cc9f20SBram Moolenaar # endif 1713f9cc9f20SBram Moolenaar if (set_group_colors((char_u *)"Scrollbar", 1714f9cc9f20SBram Moolenaar &gui.scroll_fg_pixel, &gui.scroll_bg_pixel, 1715f9cc9f20SBram Moolenaar FALSE, FALSE, FALSE)) 1716f9cc9f20SBram Moolenaar { 1717f9cc9f20SBram Moolenaar gui_new_scrollbar_colors(); 1718f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1719f9cc9f20SBram Moolenaar } 1720f9cc9f20SBram Moolenaar # endif 1721f9cc9f20SBram Moolenaar } 1722f9cc9f20SBram Moolenaar # endif 1723f9cc9f20SBram Moolenaar # ifdef FEAT_TERMGUICOLORS 1724f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 1725f9cc9f20SBram Moolenaar else 1726f9cc9f20SBram Moolenaar # endif 1727f9cc9f20SBram Moolenaar { 1728f9cc9f20SBram Moolenaar int idx; 1729f9cc9f20SBram Moolenaar 1730f9cc9f20SBram Moolenaar idx = syn_name2id((char_u *)"Normal") - 1; 1731f9cc9f20SBram Moolenaar if (idx >= 0) 1732f9cc9f20SBram Moolenaar { 1733f9cc9f20SBram Moolenaar gui_do_one_color(idx, FALSE, FALSE); 1734f9cc9f20SBram Moolenaar 1735f9cc9f20SBram Moolenaar // If the normal fg or bg color changed a complete redraw is 1736f9cc9f20SBram Moolenaar // required. 1737f9cc9f20SBram Moolenaar if (cterm_normal_fg_gui_color != HL_TABLE()[idx].sg_gui_fg 1738f9cc9f20SBram Moolenaar || cterm_normal_bg_gui_color != HL_TABLE()[idx].sg_gui_bg) 1739f9cc9f20SBram Moolenaar { 1740f9cc9f20SBram Moolenaar // if the GUI color is INVALCOLOR then we use the default cterm 1741f9cc9f20SBram Moolenaar // color 1742f9cc9f20SBram Moolenaar cterm_normal_fg_gui_color = HL_TABLE()[idx].sg_gui_fg; 1743f9cc9f20SBram Moolenaar cterm_normal_bg_gui_color = HL_TABLE()[idx].sg_gui_bg; 1744f9cc9f20SBram Moolenaar must_redraw = CLEAR; 1745f9cc9f20SBram Moolenaar } 1746f9cc9f20SBram Moolenaar } 1747f9cc9f20SBram Moolenaar } 1748f9cc9f20SBram Moolenaar # endif 1749f9cc9f20SBram Moolenaar } 1750f9cc9f20SBram Moolenaar #endif 1751f9cc9f20SBram Moolenaar 1752f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(PROTO) 1753f9cc9f20SBram Moolenaar /* 1754f9cc9f20SBram Moolenaar * Set the colors for "Normal", "Menu", "Tooltip" or "Scrollbar". 1755f9cc9f20SBram Moolenaar */ 1756f9cc9f20SBram Moolenaar static int 1757f9cc9f20SBram Moolenaar set_group_colors( 1758f9cc9f20SBram Moolenaar char_u *name, 1759f9cc9f20SBram Moolenaar guicolor_T *fgp, 1760f9cc9f20SBram Moolenaar guicolor_T *bgp, 1761f9cc9f20SBram Moolenaar int do_menu, 1762f9cc9f20SBram Moolenaar int use_norm, 1763f9cc9f20SBram Moolenaar int do_tooltip) 1764f9cc9f20SBram Moolenaar { 1765f9cc9f20SBram Moolenaar int idx; 1766f9cc9f20SBram Moolenaar 1767f9cc9f20SBram Moolenaar idx = syn_name2id(name) - 1; 1768f9cc9f20SBram Moolenaar if (idx >= 0) 1769f9cc9f20SBram Moolenaar { 1770f9cc9f20SBram Moolenaar gui_do_one_color(idx, do_menu, do_tooltip); 1771f9cc9f20SBram Moolenaar 1772f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_gui_fg != INVALCOLOR) 1773f9cc9f20SBram Moolenaar *fgp = HL_TABLE()[idx].sg_gui_fg; 1774f9cc9f20SBram Moolenaar else if (use_norm) 1775f9cc9f20SBram Moolenaar *fgp = gui.def_norm_pixel; 1776f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_gui_bg != INVALCOLOR) 1777f9cc9f20SBram Moolenaar *bgp = HL_TABLE()[idx].sg_gui_bg; 1778f9cc9f20SBram Moolenaar else if (use_norm) 1779f9cc9f20SBram Moolenaar *bgp = gui.def_back_pixel; 1780f9cc9f20SBram Moolenaar return TRUE; 1781f9cc9f20SBram Moolenaar } 1782f9cc9f20SBram Moolenaar return FALSE; 1783f9cc9f20SBram Moolenaar } 1784f9cc9f20SBram Moolenaar 1785f9cc9f20SBram Moolenaar /* 1786f9cc9f20SBram Moolenaar * Get the font of the "Normal" group. 1787f9cc9f20SBram Moolenaar * Returns "" when it's not found or not set. 1788f9cc9f20SBram Moolenaar */ 1789f9cc9f20SBram Moolenaar char_u * 1790f9cc9f20SBram Moolenaar hl_get_font_name(void) 1791f9cc9f20SBram Moolenaar { 1792f9cc9f20SBram Moolenaar int id; 1793f9cc9f20SBram Moolenaar char_u *s; 1794f9cc9f20SBram Moolenaar 1795f9cc9f20SBram Moolenaar id = syn_name2id((char_u *)"Normal"); 1796f9cc9f20SBram Moolenaar if (id > 0) 1797f9cc9f20SBram Moolenaar { 1798f9cc9f20SBram Moolenaar s = HL_TABLE()[id - 1].sg_font_name; 1799f9cc9f20SBram Moolenaar if (s != NULL) 1800f9cc9f20SBram Moolenaar return s; 1801f9cc9f20SBram Moolenaar } 1802f9cc9f20SBram Moolenaar return (char_u *)""; 1803f9cc9f20SBram Moolenaar } 1804f9cc9f20SBram Moolenaar 1805f9cc9f20SBram Moolenaar /* 1806f9cc9f20SBram Moolenaar * Set font for "Normal" group. Called by gui_mch_init_font() when a font has 1807f9cc9f20SBram Moolenaar * actually chosen to be used. 1808f9cc9f20SBram Moolenaar */ 1809f9cc9f20SBram Moolenaar void 1810f9cc9f20SBram Moolenaar hl_set_font_name(char_u *font_name) 1811f9cc9f20SBram Moolenaar { 1812f9cc9f20SBram Moolenaar int id; 1813f9cc9f20SBram Moolenaar 1814f9cc9f20SBram Moolenaar id = syn_name2id((char_u *)"Normal"); 1815f9cc9f20SBram Moolenaar if (id > 0) 1816f9cc9f20SBram Moolenaar { 1817f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[id - 1].sg_font_name); 1818f9cc9f20SBram Moolenaar HL_TABLE()[id - 1].sg_font_name = vim_strsave(font_name); 1819f9cc9f20SBram Moolenaar } 1820f9cc9f20SBram Moolenaar } 1821f9cc9f20SBram Moolenaar 1822f9cc9f20SBram Moolenaar /* 1823f9cc9f20SBram Moolenaar * Set background color for "Normal" group. Called by gui_set_bg_color() 1824f9cc9f20SBram Moolenaar * when the color is known. 1825f9cc9f20SBram Moolenaar */ 1826f9cc9f20SBram Moolenaar void 1827f9cc9f20SBram Moolenaar hl_set_bg_color_name( 1828f9cc9f20SBram Moolenaar char_u *name) // must have been allocated 1829f9cc9f20SBram Moolenaar { 1830f9cc9f20SBram Moolenaar int id; 1831f9cc9f20SBram Moolenaar 1832f9cc9f20SBram Moolenaar if (name != NULL) 1833f9cc9f20SBram Moolenaar { 1834f9cc9f20SBram Moolenaar id = syn_name2id((char_u *)"Normal"); 1835f9cc9f20SBram Moolenaar if (id > 0) 1836f9cc9f20SBram Moolenaar { 1837f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[id - 1].sg_gui_bg_name); 1838f9cc9f20SBram Moolenaar HL_TABLE()[id - 1].sg_gui_bg_name = name; 1839f9cc9f20SBram Moolenaar } 1840f9cc9f20SBram Moolenaar } 1841f9cc9f20SBram Moolenaar } 1842f9cc9f20SBram Moolenaar 1843f9cc9f20SBram Moolenaar /* 1844f9cc9f20SBram Moolenaar * Set foreground color for "Normal" group. Called by gui_set_fg_color() 1845f9cc9f20SBram Moolenaar * when the color is known. 1846f9cc9f20SBram Moolenaar */ 1847f9cc9f20SBram Moolenaar void 1848f9cc9f20SBram Moolenaar hl_set_fg_color_name( 1849f9cc9f20SBram Moolenaar char_u *name) // must have been allocated 1850f9cc9f20SBram Moolenaar { 1851f9cc9f20SBram Moolenaar int id; 1852f9cc9f20SBram Moolenaar 1853f9cc9f20SBram Moolenaar if (name != NULL) 1854f9cc9f20SBram Moolenaar { 1855f9cc9f20SBram Moolenaar id = syn_name2id((char_u *)"Normal"); 1856f9cc9f20SBram Moolenaar if (id > 0) 1857f9cc9f20SBram Moolenaar { 1858f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[id - 1].sg_gui_fg_name); 1859f9cc9f20SBram Moolenaar HL_TABLE()[id - 1].sg_gui_fg_name = name; 1860f9cc9f20SBram Moolenaar } 1861f9cc9f20SBram Moolenaar } 1862f9cc9f20SBram Moolenaar } 1863f9cc9f20SBram Moolenaar 1864f9cc9f20SBram Moolenaar /* 1865f9cc9f20SBram Moolenaar * Return the handle for a font name. 1866f9cc9f20SBram Moolenaar * Returns NOFONT when failed. 1867f9cc9f20SBram Moolenaar */ 1868f9cc9f20SBram Moolenaar static GuiFont 1869f9cc9f20SBram Moolenaar font_name2handle(char_u *name) 1870f9cc9f20SBram Moolenaar { 1871f9cc9f20SBram Moolenaar if (STRCMP(name, "NONE") == 0) 1872f9cc9f20SBram Moolenaar return NOFONT; 1873f9cc9f20SBram Moolenaar 1874f9cc9f20SBram Moolenaar return gui_mch_get_font(name, TRUE); 1875f9cc9f20SBram Moolenaar } 1876f9cc9f20SBram Moolenaar 1877f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 1878f9cc9f20SBram Moolenaar /* 1879f9cc9f20SBram Moolenaar * Return the handle for a fontset name. 1880f9cc9f20SBram Moolenaar * Returns NOFONTSET when failed. 1881f9cc9f20SBram Moolenaar */ 1882f9cc9f20SBram Moolenaar static GuiFontset 1883f9cc9f20SBram Moolenaar fontset_name2handle(char_u *name, int fixed_width) 1884f9cc9f20SBram Moolenaar { 1885f9cc9f20SBram Moolenaar if (STRCMP(name, "NONE") == 0) 1886f9cc9f20SBram Moolenaar return NOFONTSET; 1887f9cc9f20SBram Moolenaar 1888f9cc9f20SBram Moolenaar return gui_mch_get_fontset(name, TRUE, fixed_width); 1889f9cc9f20SBram Moolenaar } 1890f9cc9f20SBram Moolenaar # endif 1891f9cc9f20SBram Moolenaar 1892f9cc9f20SBram Moolenaar /* 1893f9cc9f20SBram Moolenaar * Get the font or fontset for one highlight group. 1894f9cc9f20SBram Moolenaar */ 1895f9cc9f20SBram Moolenaar static void 1896f9cc9f20SBram Moolenaar hl_do_font( 1897f9cc9f20SBram Moolenaar int idx, 1898f9cc9f20SBram Moolenaar char_u *arg, 1899f9cc9f20SBram Moolenaar int do_normal, // set normal font 1900f9cc9f20SBram Moolenaar int do_menu UNUSED, // set menu font 1901f9cc9f20SBram Moolenaar int do_tooltip UNUSED, // set tooltip font 1902f9cc9f20SBram Moolenaar int free_font) // free current font/fontset 1903f9cc9f20SBram Moolenaar { 1904f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 1905f9cc9f20SBram Moolenaar // If 'guifontset' is not empty, first try using the name as a 1906f9cc9f20SBram Moolenaar // fontset. If that doesn't work, use it as a font name. 1907f9cc9f20SBram Moolenaar if (*p_guifontset != NUL 1908f9cc9f20SBram Moolenaar # ifdef FONTSET_ALWAYS 1909f9cc9f20SBram Moolenaar || do_menu 1910f9cc9f20SBram Moolenaar # endif 1911f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_TIP 1912f9cc9f20SBram Moolenaar // In Athena & Motif, the Tooltip highlight group is always a fontset 1913f9cc9f20SBram Moolenaar || do_tooltip 1914f9cc9f20SBram Moolenaar # endif 1915f9cc9f20SBram Moolenaar ) 1916f9cc9f20SBram Moolenaar { 1917f9cc9f20SBram Moolenaar if (free_font) 1918f9cc9f20SBram Moolenaar gui_mch_free_fontset(HL_TABLE()[idx].sg_fontset); 1919f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_fontset = fontset_name2handle(arg, 0 1920f9cc9f20SBram Moolenaar # ifdef FONTSET_ALWAYS 1921f9cc9f20SBram Moolenaar || do_menu 1922f9cc9f20SBram Moolenaar # endif 1923f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_TIP 1924f9cc9f20SBram Moolenaar || do_tooltip 1925f9cc9f20SBram Moolenaar # endif 1926f9cc9f20SBram Moolenaar ); 1927f9cc9f20SBram Moolenaar } 1928f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_fontset != NOFONTSET) 1929f9cc9f20SBram Moolenaar { 1930f9cc9f20SBram Moolenaar // If it worked and it's the Normal group, use it as the normal 1931f9cc9f20SBram Moolenaar // fontset. Same for the Menu group. 1932f9cc9f20SBram Moolenaar if (do_normal) 1933f9cc9f20SBram Moolenaar gui_init_font(arg, TRUE); 1934f9cc9f20SBram Moolenaar # if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU) 1935f9cc9f20SBram Moolenaar if (do_menu) 1936f9cc9f20SBram Moolenaar { 1937f9cc9f20SBram Moolenaar # ifdef FONTSET_ALWAYS 1938f9cc9f20SBram Moolenaar gui.menu_fontset = HL_TABLE()[idx].sg_fontset; 1939f9cc9f20SBram Moolenaar # else 1940f9cc9f20SBram Moolenaar // YIKES! This is a bug waiting to crash the program 1941f9cc9f20SBram Moolenaar gui.menu_font = HL_TABLE()[idx].sg_fontset; 1942f9cc9f20SBram Moolenaar # endif 1943f9cc9f20SBram Moolenaar gui_mch_new_menu_font(); 1944f9cc9f20SBram Moolenaar } 1945f9cc9f20SBram Moolenaar # ifdef FEAT_BEVAL_GUI 1946f9cc9f20SBram Moolenaar if (do_tooltip) 1947f9cc9f20SBram Moolenaar { 1948f9cc9f20SBram Moolenaar // The Athena widget set cannot currently handle switching between 1949f9cc9f20SBram Moolenaar // displaying a single font and a fontset. 1950f9cc9f20SBram Moolenaar // If the XtNinternational resource is set to True at widget 1951f9cc9f20SBram Moolenaar // creation, then a fontset is always used, otherwise an 1952f9cc9f20SBram Moolenaar // XFontStruct is used. 1953f9cc9f20SBram Moolenaar gui.tooltip_fontset = (XFontSet)HL_TABLE()[idx].sg_fontset; 1954f9cc9f20SBram Moolenaar gui_mch_new_tooltip_font(); 1955f9cc9f20SBram Moolenaar } 1956f9cc9f20SBram Moolenaar # endif 1957f9cc9f20SBram Moolenaar # endif 1958f9cc9f20SBram Moolenaar } 1959f9cc9f20SBram Moolenaar else 1960f9cc9f20SBram Moolenaar # endif 1961f9cc9f20SBram Moolenaar { 1962f9cc9f20SBram Moolenaar if (free_font) 1963f9cc9f20SBram Moolenaar gui_mch_free_font(HL_TABLE()[idx].sg_font); 1964f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font = font_name2handle(arg); 1965f9cc9f20SBram Moolenaar // If it worked and it's the Normal group, use it as the 1966f9cc9f20SBram Moolenaar // normal font. Same for the Menu group. 1967f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_font != NOFONT) 1968f9cc9f20SBram Moolenaar { 1969f9cc9f20SBram Moolenaar if (do_normal) 1970f9cc9f20SBram Moolenaar gui_init_font(arg, FALSE); 1971f9cc9f20SBram Moolenaar #ifndef FONTSET_ALWAYS 1972f9cc9f20SBram Moolenaar # if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU) 1973f9cc9f20SBram Moolenaar if (do_menu) 1974f9cc9f20SBram Moolenaar { 1975f9cc9f20SBram Moolenaar gui.menu_font = HL_TABLE()[idx].sg_font; 1976f9cc9f20SBram Moolenaar gui_mch_new_menu_font(); 1977f9cc9f20SBram Moolenaar } 1978f9cc9f20SBram Moolenaar # endif 1979f9cc9f20SBram Moolenaar #endif 1980f9cc9f20SBram Moolenaar } 1981f9cc9f20SBram Moolenaar } 1982f9cc9f20SBram Moolenaar } 1983f9cc9f20SBram Moolenaar 1984f9cc9f20SBram Moolenaar #endif // FEAT_GUI 1985f9cc9f20SBram Moolenaar 1986f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) || defined(PROTO) 1987f9cc9f20SBram Moolenaar /* 1988f9cc9f20SBram Moolenaar * Return the handle for a color name. 1989f9cc9f20SBram Moolenaar * Returns INVALCOLOR when failed. 1990f9cc9f20SBram Moolenaar */ 1991f9cc9f20SBram Moolenaar guicolor_T 1992f9cc9f20SBram Moolenaar color_name2handle(char_u *name) 1993f9cc9f20SBram Moolenaar { 1994f9cc9f20SBram Moolenaar if (STRCMP(name, "NONE") == 0) 1995f9cc9f20SBram Moolenaar return INVALCOLOR; 1996f9cc9f20SBram Moolenaar 1997f9cc9f20SBram Moolenaar if (STRICMP(name, "fg") == 0 || STRICMP(name, "foreground") == 0) 1998f9cc9f20SBram Moolenaar { 1999f9cc9f20SBram Moolenaar #if defined(FEAT_TERMGUICOLORS) && defined(FEAT_GUI) 2000f9cc9f20SBram Moolenaar if (gui.in_use) 2001f9cc9f20SBram Moolenaar #endif 2002f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2003f9cc9f20SBram Moolenaar return gui.norm_pixel; 2004f9cc9f20SBram Moolenaar #endif 2005f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2006f9cc9f20SBram Moolenaar if (cterm_normal_fg_gui_color != INVALCOLOR) 2007f9cc9f20SBram Moolenaar return cterm_normal_fg_gui_color; 2008f9cc9f20SBram Moolenaar // Guess that the foreground is black or white. 2009f9cc9f20SBram Moolenaar return GUI_GET_COLOR((char_u *)(*p_bg == 'l' ? "black" : "white")); 2010f9cc9f20SBram Moolenaar #endif 2011f9cc9f20SBram Moolenaar } 2012f9cc9f20SBram Moolenaar if (STRICMP(name, "bg") == 0 || STRICMP(name, "background") == 0) 2013f9cc9f20SBram Moolenaar { 2014f9cc9f20SBram Moolenaar #if defined(FEAT_TERMGUICOLORS) && defined(FEAT_GUI) 2015f9cc9f20SBram Moolenaar if (gui.in_use) 2016f9cc9f20SBram Moolenaar #endif 2017f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2018f9cc9f20SBram Moolenaar return gui.back_pixel; 2019f9cc9f20SBram Moolenaar #endif 2020f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2021f9cc9f20SBram Moolenaar if (cterm_normal_bg_gui_color != INVALCOLOR) 2022f9cc9f20SBram Moolenaar return cterm_normal_bg_gui_color; 2023f9cc9f20SBram Moolenaar // Guess that the background is white or black. 2024f9cc9f20SBram Moolenaar return GUI_GET_COLOR((char_u *)(*p_bg == 'l' ? "white" : "black")); 2025f9cc9f20SBram Moolenaar #endif 2026f9cc9f20SBram Moolenaar } 2027f9cc9f20SBram Moolenaar 2028f9cc9f20SBram Moolenaar return GUI_GET_COLOR(name); 2029f9cc9f20SBram Moolenaar } 2030f9cc9f20SBram Moolenaar #endif 2031f9cc9f20SBram Moolenaar 2032f9cc9f20SBram Moolenaar /* 2033f9cc9f20SBram Moolenaar * Table with the specifications for an attribute number. 2034f9cc9f20SBram Moolenaar * Note that this table is used by ALL buffers. This is required because the 2035f9cc9f20SBram Moolenaar * GUI can redraw at any time for any buffer. 2036f9cc9f20SBram Moolenaar */ 2037f9cc9f20SBram Moolenaar static garray_T term_attr_table = {0, 0, 0, 0, NULL}; 2038f9cc9f20SBram Moolenaar 2039f9cc9f20SBram Moolenaar #define TERM_ATTR_ENTRY(idx) ((attrentry_T *)term_attr_table.ga_data)[idx] 2040f9cc9f20SBram Moolenaar 2041f9cc9f20SBram Moolenaar static garray_T cterm_attr_table = {0, 0, 0, 0, NULL}; 2042f9cc9f20SBram Moolenaar 2043f9cc9f20SBram Moolenaar #define CTERM_ATTR_ENTRY(idx) ((attrentry_T *)cterm_attr_table.ga_data)[idx] 2044f9cc9f20SBram Moolenaar 2045f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2046f9cc9f20SBram Moolenaar static garray_T gui_attr_table = {0, 0, 0, 0, NULL}; 2047f9cc9f20SBram Moolenaar 2048f9cc9f20SBram Moolenaar #define GUI_ATTR_ENTRY(idx) ((attrentry_T *)gui_attr_table.ga_data)[idx] 2049f9cc9f20SBram Moolenaar #endif 2050f9cc9f20SBram Moolenaar 2051f9cc9f20SBram Moolenaar /* 2052f9cc9f20SBram Moolenaar * Return the attr number for a set of colors and font. 2053f9cc9f20SBram Moolenaar * Add a new entry to the term_attr_table, cterm_attr_table or gui_attr_table 2054f9cc9f20SBram Moolenaar * if the combination is new. 2055f9cc9f20SBram Moolenaar * Return 0 for error (no more room). 2056f9cc9f20SBram Moolenaar */ 2057f9cc9f20SBram Moolenaar static int 2058f9cc9f20SBram Moolenaar get_attr_entry(garray_T *table, attrentry_T *aep) 2059f9cc9f20SBram Moolenaar { 2060f9cc9f20SBram Moolenaar int i; 2061f9cc9f20SBram Moolenaar attrentry_T *taep; 2062f9cc9f20SBram Moolenaar static int recursive = FALSE; 2063f9cc9f20SBram Moolenaar 2064f9cc9f20SBram Moolenaar /* 2065f9cc9f20SBram Moolenaar * Init the table, in case it wasn't done yet. 2066f9cc9f20SBram Moolenaar */ 2067f9cc9f20SBram Moolenaar table->ga_itemsize = sizeof(attrentry_T); 2068f9cc9f20SBram Moolenaar table->ga_growsize = 7; 2069f9cc9f20SBram Moolenaar 2070f9cc9f20SBram Moolenaar /* 2071f9cc9f20SBram Moolenaar * Try to find an entry with the same specifications. 2072f9cc9f20SBram Moolenaar */ 2073f9cc9f20SBram Moolenaar for (i = 0; i < table->ga_len; ++i) 2074f9cc9f20SBram Moolenaar { 2075f9cc9f20SBram Moolenaar taep = &(((attrentry_T *)table->ga_data)[i]); 2076f9cc9f20SBram Moolenaar if ( aep->ae_attr == taep->ae_attr 2077f9cc9f20SBram Moolenaar && ( 2078f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2079f9cc9f20SBram Moolenaar (table == &gui_attr_table 2080f9cc9f20SBram Moolenaar && (aep->ae_u.gui.fg_color == taep->ae_u.gui.fg_color 2081f9cc9f20SBram Moolenaar && aep->ae_u.gui.bg_color 2082f9cc9f20SBram Moolenaar == taep->ae_u.gui.bg_color 2083f9cc9f20SBram Moolenaar && aep->ae_u.gui.sp_color 2084f9cc9f20SBram Moolenaar == taep->ae_u.gui.sp_color 2085f9cc9f20SBram Moolenaar && aep->ae_u.gui.font == taep->ae_u.gui.font 2086f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 2087f9cc9f20SBram Moolenaar && aep->ae_u.gui.fontset == taep->ae_u.gui.fontset 2088f9cc9f20SBram Moolenaar # endif 2089f9cc9f20SBram Moolenaar )) 2090f9cc9f20SBram Moolenaar || 2091f9cc9f20SBram Moolenaar #endif 2092f9cc9f20SBram Moolenaar (table == &term_attr_table 2093f9cc9f20SBram Moolenaar && (aep->ae_u.term.start == NULL) 2094f9cc9f20SBram Moolenaar == (taep->ae_u.term.start == NULL) 2095f9cc9f20SBram Moolenaar && (aep->ae_u.term.start == NULL 2096f9cc9f20SBram Moolenaar || STRCMP(aep->ae_u.term.start, 2097f9cc9f20SBram Moolenaar taep->ae_u.term.start) == 0) 2098f9cc9f20SBram Moolenaar && (aep->ae_u.term.stop == NULL) 2099f9cc9f20SBram Moolenaar == (taep->ae_u.term.stop == NULL) 2100f9cc9f20SBram Moolenaar && (aep->ae_u.term.stop == NULL 2101f9cc9f20SBram Moolenaar || STRCMP(aep->ae_u.term.stop, 2102f9cc9f20SBram Moolenaar taep->ae_u.term.stop) == 0)) 2103f9cc9f20SBram Moolenaar || (table == &cterm_attr_table 2104f9cc9f20SBram Moolenaar && aep->ae_u.cterm.fg_color 2105f9cc9f20SBram Moolenaar == taep->ae_u.cterm.fg_color 2106f9cc9f20SBram Moolenaar && aep->ae_u.cterm.bg_color 2107f9cc9f20SBram Moolenaar == taep->ae_u.cterm.bg_color 2108f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2109f9cc9f20SBram Moolenaar && aep->ae_u.cterm.fg_rgb 2110f9cc9f20SBram Moolenaar == taep->ae_u.cterm.fg_rgb 2111f9cc9f20SBram Moolenaar && aep->ae_u.cterm.bg_rgb 2112f9cc9f20SBram Moolenaar == taep->ae_u.cterm.bg_rgb 2113f9cc9f20SBram Moolenaar #endif 2114f9cc9f20SBram Moolenaar ))) 2115f9cc9f20SBram Moolenaar 2116f9cc9f20SBram Moolenaar return i + ATTR_OFF; 2117f9cc9f20SBram Moolenaar } 2118f9cc9f20SBram Moolenaar 2119f9cc9f20SBram Moolenaar if (table->ga_len + ATTR_OFF > MAX_TYPENR) 2120f9cc9f20SBram Moolenaar { 2121f9cc9f20SBram Moolenaar /* 2122f9cc9f20SBram Moolenaar * Running out of attribute entries! remove all attributes, and 2123f9cc9f20SBram Moolenaar * compute new ones for all groups. 2124f9cc9f20SBram Moolenaar * When called recursively, we are really out of numbers. 2125f9cc9f20SBram Moolenaar */ 2126f9cc9f20SBram Moolenaar if (recursive) 2127f9cc9f20SBram Moolenaar { 2128f9cc9f20SBram Moolenaar emsg(_("E424: Too many different highlighting attributes in use")); 2129f9cc9f20SBram Moolenaar return 0; 2130f9cc9f20SBram Moolenaar } 2131f9cc9f20SBram Moolenaar recursive = TRUE; 2132f9cc9f20SBram Moolenaar 2133f9cc9f20SBram Moolenaar clear_hl_tables(); 2134f9cc9f20SBram Moolenaar 2135f9cc9f20SBram Moolenaar must_redraw = CLEAR; 2136f9cc9f20SBram Moolenaar 2137f9cc9f20SBram Moolenaar for (i = 0; i < highlight_ga.ga_len; ++i) 2138f9cc9f20SBram Moolenaar set_hl_attr(i); 2139f9cc9f20SBram Moolenaar 2140f9cc9f20SBram Moolenaar recursive = FALSE; 2141f9cc9f20SBram Moolenaar } 2142f9cc9f20SBram Moolenaar 2143f9cc9f20SBram Moolenaar /* 2144f9cc9f20SBram Moolenaar * This is a new combination of colors and font, add an entry. 2145f9cc9f20SBram Moolenaar */ 2146f9cc9f20SBram Moolenaar if (ga_grow(table, 1) == FAIL) 2147f9cc9f20SBram Moolenaar return 0; 2148f9cc9f20SBram Moolenaar 2149f9cc9f20SBram Moolenaar taep = &(((attrentry_T *)table->ga_data)[table->ga_len]); 2150f9cc9f20SBram Moolenaar vim_memset(taep, 0, sizeof(attrentry_T)); 2151f9cc9f20SBram Moolenaar taep->ae_attr = aep->ae_attr; 2152f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2153f9cc9f20SBram Moolenaar if (table == &gui_attr_table) 2154f9cc9f20SBram Moolenaar { 2155f9cc9f20SBram Moolenaar taep->ae_u.gui.fg_color = aep->ae_u.gui.fg_color; 2156f9cc9f20SBram Moolenaar taep->ae_u.gui.bg_color = aep->ae_u.gui.bg_color; 2157f9cc9f20SBram Moolenaar taep->ae_u.gui.sp_color = aep->ae_u.gui.sp_color; 2158f9cc9f20SBram Moolenaar taep->ae_u.gui.font = aep->ae_u.gui.font; 2159f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 2160f9cc9f20SBram Moolenaar taep->ae_u.gui.fontset = aep->ae_u.gui.fontset; 2161f9cc9f20SBram Moolenaar # endif 2162f9cc9f20SBram Moolenaar } 2163f9cc9f20SBram Moolenaar #endif 2164f9cc9f20SBram Moolenaar if (table == &term_attr_table) 2165f9cc9f20SBram Moolenaar { 2166f9cc9f20SBram Moolenaar if (aep->ae_u.term.start == NULL) 2167f9cc9f20SBram Moolenaar taep->ae_u.term.start = NULL; 2168f9cc9f20SBram Moolenaar else 2169f9cc9f20SBram Moolenaar taep->ae_u.term.start = vim_strsave(aep->ae_u.term.start); 2170f9cc9f20SBram Moolenaar if (aep->ae_u.term.stop == NULL) 2171f9cc9f20SBram Moolenaar taep->ae_u.term.stop = NULL; 2172f9cc9f20SBram Moolenaar else 2173f9cc9f20SBram Moolenaar taep->ae_u.term.stop = vim_strsave(aep->ae_u.term.stop); 2174f9cc9f20SBram Moolenaar } 2175f9cc9f20SBram Moolenaar else if (table == &cterm_attr_table) 2176f9cc9f20SBram Moolenaar { 2177f9cc9f20SBram Moolenaar taep->ae_u.cterm.fg_color = aep->ae_u.cterm.fg_color; 2178f9cc9f20SBram Moolenaar taep->ae_u.cterm.bg_color = aep->ae_u.cterm.bg_color; 2179f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2180f9cc9f20SBram Moolenaar taep->ae_u.cterm.fg_rgb = aep->ae_u.cterm.fg_rgb; 2181f9cc9f20SBram Moolenaar taep->ae_u.cterm.bg_rgb = aep->ae_u.cterm.bg_rgb; 2182f9cc9f20SBram Moolenaar #endif 2183f9cc9f20SBram Moolenaar } 2184f9cc9f20SBram Moolenaar ++table->ga_len; 2185f9cc9f20SBram Moolenaar return (table->ga_len - 1 + ATTR_OFF); 2186f9cc9f20SBram Moolenaar } 2187f9cc9f20SBram Moolenaar 2188f9cc9f20SBram Moolenaar #if defined(FEAT_TERMINAL) || defined(PROTO) 2189f9cc9f20SBram Moolenaar /* 2190f9cc9f20SBram Moolenaar * Get an attribute index for a cterm entry. 2191f9cc9f20SBram Moolenaar * Uses an existing entry when possible or adds one when needed. 2192f9cc9f20SBram Moolenaar */ 2193f9cc9f20SBram Moolenaar int 2194f9cc9f20SBram Moolenaar get_cterm_attr_idx(int attr, int fg, int bg) 2195f9cc9f20SBram Moolenaar { 2196f9cc9f20SBram Moolenaar attrentry_T at_en; 2197f9cc9f20SBram Moolenaar 2198f9cc9f20SBram Moolenaar vim_memset(&at_en, 0, sizeof(attrentry_T)); 2199f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2200f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_rgb = INVALCOLOR; 2201f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_rgb = INVALCOLOR; 2202f9cc9f20SBram Moolenaar #endif 2203f9cc9f20SBram Moolenaar at_en.ae_attr = attr; 2204f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_color = fg; 2205f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_color = bg; 2206f9cc9f20SBram Moolenaar return get_attr_entry(&cterm_attr_table, &at_en); 2207f9cc9f20SBram Moolenaar } 2208f9cc9f20SBram Moolenaar #endif 2209f9cc9f20SBram Moolenaar 2210f9cc9f20SBram Moolenaar #if (defined(FEAT_TERMINAL) && defined(FEAT_TERMGUICOLORS)) || defined(PROTO) 2211f9cc9f20SBram Moolenaar /* 2212f9cc9f20SBram Moolenaar * Get an attribute index for a 'termguicolors' entry. 2213f9cc9f20SBram Moolenaar * Uses an existing entry when possible or adds one when needed. 2214f9cc9f20SBram Moolenaar */ 2215f9cc9f20SBram Moolenaar int 2216f9cc9f20SBram Moolenaar get_tgc_attr_idx(int attr, guicolor_T fg, guicolor_T bg) 2217f9cc9f20SBram Moolenaar { 2218f9cc9f20SBram Moolenaar attrentry_T at_en; 2219f9cc9f20SBram Moolenaar 2220f9cc9f20SBram Moolenaar vim_memset(&at_en, 0, sizeof(attrentry_T)); 2221f9cc9f20SBram Moolenaar at_en.ae_attr = attr; 2222f9cc9f20SBram Moolenaar if (fg == INVALCOLOR && bg == INVALCOLOR) 2223f9cc9f20SBram Moolenaar { 2224f9cc9f20SBram Moolenaar // If both GUI colors are not set fall back to the cterm colors. Helps 2225f9cc9f20SBram Moolenaar // if the GUI only has an attribute, such as undercurl. 2226f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_rgb = CTERMCOLOR; 2227f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_rgb = CTERMCOLOR; 2228f9cc9f20SBram Moolenaar } 2229f9cc9f20SBram Moolenaar else 2230f9cc9f20SBram Moolenaar { 2231f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_rgb = fg; 2232f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_rgb = bg; 2233f9cc9f20SBram Moolenaar } 2234f9cc9f20SBram Moolenaar return get_attr_entry(&cterm_attr_table, &at_en); 2235f9cc9f20SBram Moolenaar } 2236f9cc9f20SBram Moolenaar #endif 2237f9cc9f20SBram Moolenaar 2238f9cc9f20SBram Moolenaar #if (defined(FEAT_TERMINAL) && defined(FEAT_GUI)) || defined(PROTO) 2239f9cc9f20SBram Moolenaar /* 2240f9cc9f20SBram Moolenaar * Get an attribute index for a cterm entry. 2241f9cc9f20SBram Moolenaar * Uses an existing entry when possible or adds one when needed. 2242f9cc9f20SBram Moolenaar */ 2243f9cc9f20SBram Moolenaar int 2244f9cc9f20SBram Moolenaar get_gui_attr_idx(int attr, guicolor_T fg, guicolor_T bg) 2245f9cc9f20SBram Moolenaar { 2246f9cc9f20SBram Moolenaar attrentry_T at_en; 2247f9cc9f20SBram Moolenaar 2248f9cc9f20SBram Moolenaar vim_memset(&at_en, 0, sizeof(attrentry_T)); 2249f9cc9f20SBram Moolenaar at_en.ae_attr = attr; 2250f9cc9f20SBram Moolenaar at_en.ae_u.gui.fg_color = fg; 2251f9cc9f20SBram Moolenaar at_en.ae_u.gui.bg_color = bg; 2252f9cc9f20SBram Moolenaar return get_attr_entry(&gui_attr_table, &at_en); 2253f9cc9f20SBram Moolenaar } 2254f9cc9f20SBram Moolenaar #endif 2255f9cc9f20SBram Moolenaar 2256f9cc9f20SBram Moolenaar /* 2257f9cc9f20SBram Moolenaar * Clear all highlight tables. 2258f9cc9f20SBram Moolenaar */ 2259f9cc9f20SBram Moolenaar void 2260f9cc9f20SBram Moolenaar clear_hl_tables(void) 2261f9cc9f20SBram Moolenaar { 2262f9cc9f20SBram Moolenaar int i; 2263f9cc9f20SBram Moolenaar attrentry_T *taep; 2264f9cc9f20SBram Moolenaar 2265f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2266f9cc9f20SBram Moolenaar ga_clear(&gui_attr_table); 2267f9cc9f20SBram Moolenaar #endif 2268f9cc9f20SBram Moolenaar for (i = 0; i < term_attr_table.ga_len; ++i) 2269f9cc9f20SBram Moolenaar { 2270f9cc9f20SBram Moolenaar taep = &(((attrentry_T *)term_attr_table.ga_data)[i]); 2271f9cc9f20SBram Moolenaar vim_free(taep->ae_u.term.start); 2272f9cc9f20SBram Moolenaar vim_free(taep->ae_u.term.stop); 2273f9cc9f20SBram Moolenaar } 2274f9cc9f20SBram Moolenaar ga_clear(&term_attr_table); 2275f9cc9f20SBram Moolenaar ga_clear(&cterm_attr_table); 2276f9cc9f20SBram Moolenaar } 2277f9cc9f20SBram Moolenaar 2278f9cc9f20SBram Moolenaar /* 2279f9cc9f20SBram Moolenaar * Combine special attributes (e.g., for spelling) with other attributes 2280f9cc9f20SBram Moolenaar * (e.g., for syntax highlighting). 2281f9cc9f20SBram Moolenaar * "prim_attr" overrules "char_attr". 2282f9cc9f20SBram Moolenaar * This creates a new group when required. 2283f9cc9f20SBram Moolenaar * Since we expect there to be few spelling mistakes we don't cache the 2284f9cc9f20SBram Moolenaar * result. 2285f9cc9f20SBram Moolenaar * Return the resulting attributes. 2286f9cc9f20SBram Moolenaar */ 2287f9cc9f20SBram Moolenaar int 2288f9cc9f20SBram Moolenaar hl_combine_attr(int char_attr, int prim_attr) 2289f9cc9f20SBram Moolenaar { 2290f9cc9f20SBram Moolenaar attrentry_T *char_aep = NULL; 2291f9cc9f20SBram Moolenaar attrentry_T *spell_aep; 2292f9cc9f20SBram Moolenaar attrentry_T new_en; 2293f9cc9f20SBram Moolenaar 2294f9cc9f20SBram Moolenaar if (char_attr == 0) 2295f9cc9f20SBram Moolenaar return prim_attr; 2296f9cc9f20SBram Moolenaar if (char_attr <= HL_ALL && prim_attr <= HL_ALL) 2297f9cc9f20SBram Moolenaar return ATTR_COMBINE(char_attr, prim_attr); 2298f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2299f9cc9f20SBram Moolenaar if (gui.in_use) 2300f9cc9f20SBram Moolenaar { 2301f9cc9f20SBram Moolenaar if (char_attr > HL_ALL) 2302f9cc9f20SBram Moolenaar char_aep = syn_gui_attr2entry(char_attr); 2303f9cc9f20SBram Moolenaar if (char_aep != NULL) 2304f9cc9f20SBram Moolenaar new_en = *char_aep; 2305f9cc9f20SBram Moolenaar else 2306f9cc9f20SBram Moolenaar { 2307f9cc9f20SBram Moolenaar vim_memset(&new_en, 0, sizeof(new_en)); 2308f9cc9f20SBram Moolenaar new_en.ae_u.gui.fg_color = INVALCOLOR; 2309f9cc9f20SBram Moolenaar new_en.ae_u.gui.bg_color = INVALCOLOR; 2310f9cc9f20SBram Moolenaar new_en.ae_u.gui.sp_color = INVALCOLOR; 2311f9cc9f20SBram Moolenaar if (char_attr <= HL_ALL) 2312f9cc9f20SBram Moolenaar new_en.ae_attr = char_attr; 2313f9cc9f20SBram Moolenaar } 2314f9cc9f20SBram Moolenaar 2315f9cc9f20SBram Moolenaar if (prim_attr <= HL_ALL) 2316f9cc9f20SBram Moolenaar new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, prim_attr); 2317f9cc9f20SBram Moolenaar else 2318f9cc9f20SBram Moolenaar { 2319f9cc9f20SBram Moolenaar spell_aep = syn_gui_attr2entry(prim_attr); 2320f9cc9f20SBram Moolenaar if (spell_aep != NULL) 2321f9cc9f20SBram Moolenaar { 2322f9cc9f20SBram Moolenaar new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, 2323f9cc9f20SBram Moolenaar spell_aep->ae_attr); 2324f9cc9f20SBram Moolenaar if (spell_aep->ae_u.gui.fg_color != INVALCOLOR) 2325f9cc9f20SBram Moolenaar new_en.ae_u.gui.fg_color = spell_aep->ae_u.gui.fg_color; 2326f9cc9f20SBram Moolenaar if (spell_aep->ae_u.gui.bg_color != INVALCOLOR) 2327f9cc9f20SBram Moolenaar new_en.ae_u.gui.bg_color = spell_aep->ae_u.gui.bg_color; 2328f9cc9f20SBram Moolenaar if (spell_aep->ae_u.gui.sp_color != INVALCOLOR) 2329f9cc9f20SBram Moolenaar new_en.ae_u.gui.sp_color = spell_aep->ae_u.gui.sp_color; 2330f9cc9f20SBram Moolenaar if (spell_aep->ae_u.gui.font != NOFONT) 2331f9cc9f20SBram Moolenaar new_en.ae_u.gui.font = spell_aep->ae_u.gui.font; 2332f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 2333f9cc9f20SBram Moolenaar if (spell_aep->ae_u.gui.fontset != NOFONTSET) 2334f9cc9f20SBram Moolenaar new_en.ae_u.gui.fontset = spell_aep->ae_u.gui.fontset; 2335f9cc9f20SBram Moolenaar # endif 2336f9cc9f20SBram Moolenaar } 2337f9cc9f20SBram Moolenaar } 2338f9cc9f20SBram Moolenaar return get_attr_entry(&gui_attr_table, &new_en); 2339f9cc9f20SBram Moolenaar } 2340f9cc9f20SBram Moolenaar #endif 2341f9cc9f20SBram Moolenaar 2342f9cc9f20SBram Moolenaar if (IS_CTERM) 2343f9cc9f20SBram Moolenaar { 2344f9cc9f20SBram Moolenaar if (char_attr > HL_ALL) 2345f9cc9f20SBram Moolenaar char_aep = syn_cterm_attr2entry(char_attr); 2346f9cc9f20SBram Moolenaar if (char_aep != NULL) 2347f9cc9f20SBram Moolenaar new_en = *char_aep; 2348f9cc9f20SBram Moolenaar else 2349f9cc9f20SBram Moolenaar { 2350f9cc9f20SBram Moolenaar vim_memset(&new_en, 0, sizeof(new_en)); 2351f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2352f9cc9f20SBram Moolenaar new_en.ae_u.cterm.bg_rgb = INVALCOLOR; 2353f9cc9f20SBram Moolenaar new_en.ae_u.cterm.fg_rgb = INVALCOLOR; 2354f9cc9f20SBram Moolenaar #endif 2355f9cc9f20SBram Moolenaar if (char_attr <= HL_ALL) 2356f9cc9f20SBram Moolenaar new_en.ae_attr = char_attr; 2357f9cc9f20SBram Moolenaar } 2358f9cc9f20SBram Moolenaar 2359f9cc9f20SBram Moolenaar if (prim_attr <= HL_ALL) 2360f9cc9f20SBram Moolenaar new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, prim_attr); 2361f9cc9f20SBram Moolenaar else 2362f9cc9f20SBram Moolenaar { 2363f9cc9f20SBram Moolenaar spell_aep = syn_cterm_attr2entry(prim_attr); 2364f9cc9f20SBram Moolenaar if (spell_aep != NULL) 2365f9cc9f20SBram Moolenaar { 2366f9cc9f20SBram Moolenaar new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, 2367f9cc9f20SBram Moolenaar spell_aep->ae_attr); 2368f9cc9f20SBram Moolenaar if (spell_aep->ae_u.cterm.fg_color > 0) 2369f9cc9f20SBram Moolenaar new_en.ae_u.cterm.fg_color = spell_aep->ae_u.cterm.fg_color; 2370f9cc9f20SBram Moolenaar if (spell_aep->ae_u.cterm.bg_color > 0) 2371f9cc9f20SBram Moolenaar new_en.ae_u.cterm.bg_color = spell_aep->ae_u.cterm.bg_color; 2372f9cc9f20SBram Moolenaar #ifdef FEAT_TERMGUICOLORS 2373f9cc9f20SBram Moolenaar // If both fg and bg are not set fall back to cterm colors. 2374f9cc9f20SBram Moolenaar // Helps for SpellBad which uses undercurl in the GUI. 2375f9cc9f20SBram Moolenaar if (COLOR_INVALID(spell_aep->ae_u.cterm.fg_rgb) 2376f9cc9f20SBram Moolenaar && COLOR_INVALID(spell_aep->ae_u.cterm.bg_rgb)) 2377f9cc9f20SBram Moolenaar { 2378f9cc9f20SBram Moolenaar if (spell_aep->ae_u.cterm.fg_color > 0) 2379f9cc9f20SBram Moolenaar new_en.ae_u.cterm.fg_rgb = CTERMCOLOR; 2380f9cc9f20SBram Moolenaar if (spell_aep->ae_u.cterm.bg_color > 0) 2381f9cc9f20SBram Moolenaar new_en.ae_u.cterm.bg_rgb = CTERMCOLOR; 2382f9cc9f20SBram Moolenaar } 2383f9cc9f20SBram Moolenaar else 2384f9cc9f20SBram Moolenaar { 2385f9cc9f20SBram Moolenaar if (spell_aep->ae_u.cterm.fg_rgb != INVALCOLOR) 2386f9cc9f20SBram Moolenaar new_en.ae_u.cterm.fg_rgb = spell_aep->ae_u.cterm.fg_rgb; 2387f9cc9f20SBram Moolenaar if (spell_aep->ae_u.cterm.bg_rgb != INVALCOLOR) 2388f9cc9f20SBram Moolenaar new_en.ae_u.cterm.bg_rgb = spell_aep->ae_u.cterm.bg_rgb; 2389f9cc9f20SBram Moolenaar } 2390f9cc9f20SBram Moolenaar #endif 2391f9cc9f20SBram Moolenaar } 2392f9cc9f20SBram Moolenaar } 2393f9cc9f20SBram Moolenaar return get_attr_entry(&cterm_attr_table, &new_en); 2394f9cc9f20SBram Moolenaar } 2395f9cc9f20SBram Moolenaar 2396f9cc9f20SBram Moolenaar if (char_attr > HL_ALL) 2397f9cc9f20SBram Moolenaar char_aep = syn_term_attr2entry(char_attr); 2398f9cc9f20SBram Moolenaar if (char_aep != NULL) 2399f9cc9f20SBram Moolenaar new_en = *char_aep; 2400f9cc9f20SBram Moolenaar else 2401f9cc9f20SBram Moolenaar { 2402f9cc9f20SBram Moolenaar vim_memset(&new_en, 0, sizeof(new_en)); 2403f9cc9f20SBram Moolenaar if (char_attr <= HL_ALL) 2404f9cc9f20SBram Moolenaar new_en.ae_attr = char_attr; 2405f9cc9f20SBram Moolenaar } 2406f9cc9f20SBram Moolenaar 2407f9cc9f20SBram Moolenaar if (prim_attr <= HL_ALL) 2408f9cc9f20SBram Moolenaar new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, prim_attr); 2409f9cc9f20SBram Moolenaar else 2410f9cc9f20SBram Moolenaar { 2411f9cc9f20SBram Moolenaar spell_aep = syn_term_attr2entry(prim_attr); 2412f9cc9f20SBram Moolenaar if (spell_aep != NULL) 2413f9cc9f20SBram Moolenaar { 2414f9cc9f20SBram Moolenaar new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, spell_aep->ae_attr); 2415f9cc9f20SBram Moolenaar if (spell_aep->ae_u.term.start != NULL) 2416f9cc9f20SBram Moolenaar { 2417f9cc9f20SBram Moolenaar new_en.ae_u.term.start = spell_aep->ae_u.term.start; 2418f9cc9f20SBram Moolenaar new_en.ae_u.term.stop = spell_aep->ae_u.term.stop; 2419f9cc9f20SBram Moolenaar } 2420f9cc9f20SBram Moolenaar } 2421f9cc9f20SBram Moolenaar } 2422f9cc9f20SBram Moolenaar return get_attr_entry(&term_attr_table, &new_en); 2423f9cc9f20SBram Moolenaar } 2424f9cc9f20SBram Moolenaar 2425f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2426f9cc9f20SBram Moolenaar attrentry_T * 2427f9cc9f20SBram Moolenaar syn_gui_attr2entry(int attr) 2428f9cc9f20SBram Moolenaar { 2429f9cc9f20SBram Moolenaar attr -= ATTR_OFF; 2430f9cc9f20SBram Moolenaar if (attr >= gui_attr_table.ga_len) // did ":syntax clear" 2431f9cc9f20SBram Moolenaar return NULL; 2432f9cc9f20SBram Moolenaar return &(GUI_ATTR_ENTRY(attr)); 2433f9cc9f20SBram Moolenaar } 2434f9cc9f20SBram Moolenaar #endif 2435f9cc9f20SBram Moolenaar 2436f9cc9f20SBram Moolenaar /* 2437f9cc9f20SBram Moolenaar * Get the highlight attributes (HL_BOLD etc.) from an attribute nr. 2438f9cc9f20SBram Moolenaar * Only to be used when "attr" > HL_ALL. 2439f9cc9f20SBram Moolenaar */ 2440f9cc9f20SBram Moolenaar int 2441f9cc9f20SBram Moolenaar syn_attr2attr(int attr) 2442f9cc9f20SBram Moolenaar { 2443f9cc9f20SBram Moolenaar attrentry_T *aep; 2444f9cc9f20SBram Moolenaar 2445f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2446f9cc9f20SBram Moolenaar if (gui.in_use) 2447f9cc9f20SBram Moolenaar aep = syn_gui_attr2entry(attr); 2448f9cc9f20SBram Moolenaar else 2449f9cc9f20SBram Moolenaar #endif 2450f9cc9f20SBram Moolenaar if (IS_CTERM) 2451f9cc9f20SBram Moolenaar aep = syn_cterm_attr2entry(attr); 2452f9cc9f20SBram Moolenaar else 2453f9cc9f20SBram Moolenaar aep = syn_term_attr2entry(attr); 2454f9cc9f20SBram Moolenaar 2455f9cc9f20SBram Moolenaar if (aep == NULL) // highlighting not set 2456f9cc9f20SBram Moolenaar return 0; 2457f9cc9f20SBram Moolenaar return aep->ae_attr; 2458f9cc9f20SBram Moolenaar } 2459f9cc9f20SBram Moolenaar 2460f9cc9f20SBram Moolenaar 2461f9cc9f20SBram Moolenaar attrentry_T * 2462f9cc9f20SBram Moolenaar syn_term_attr2entry(int attr) 2463f9cc9f20SBram Moolenaar { 2464f9cc9f20SBram Moolenaar attr -= ATTR_OFF; 2465f9cc9f20SBram Moolenaar if (attr >= term_attr_table.ga_len) // did ":syntax clear" 2466f9cc9f20SBram Moolenaar return NULL; 2467f9cc9f20SBram Moolenaar return &(TERM_ATTR_ENTRY(attr)); 2468f9cc9f20SBram Moolenaar } 2469f9cc9f20SBram Moolenaar 2470f9cc9f20SBram Moolenaar attrentry_T * 2471f9cc9f20SBram Moolenaar syn_cterm_attr2entry(int attr) 2472f9cc9f20SBram Moolenaar { 2473f9cc9f20SBram Moolenaar attr -= ATTR_OFF; 2474f9cc9f20SBram Moolenaar if (attr >= cterm_attr_table.ga_len) // did ":syntax clear" 2475f9cc9f20SBram Moolenaar return NULL; 2476f9cc9f20SBram Moolenaar return &(CTERM_ATTR_ENTRY(attr)); 2477f9cc9f20SBram Moolenaar } 2478f9cc9f20SBram Moolenaar 2479f9cc9f20SBram Moolenaar #define LIST_ATTR 1 2480f9cc9f20SBram Moolenaar #define LIST_STRING 2 2481f9cc9f20SBram Moolenaar #define LIST_INT 3 2482f9cc9f20SBram Moolenaar 2483f9cc9f20SBram Moolenaar static void 2484f9cc9f20SBram Moolenaar highlight_list_one(int id) 2485f9cc9f20SBram Moolenaar { 2486f9cc9f20SBram Moolenaar hl_group_T *sgp; 2487f9cc9f20SBram Moolenaar int didh = FALSE; 2488f9cc9f20SBram Moolenaar 2489f9cc9f20SBram Moolenaar sgp = &HL_TABLE()[id - 1]; // index is ID minus one 2490f9cc9f20SBram Moolenaar 2491f9cc9f20SBram Moolenaar if (message_filtered(sgp->sg_name)) 2492f9cc9f20SBram Moolenaar return; 2493f9cc9f20SBram Moolenaar 2494f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_ATTR, 2495f9cc9f20SBram Moolenaar sgp->sg_term, NULL, "term"); 2496f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_STRING, 2497f9cc9f20SBram Moolenaar 0, sgp->sg_start, "start"); 2498f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_STRING, 2499f9cc9f20SBram Moolenaar 0, sgp->sg_stop, "stop"); 2500f9cc9f20SBram Moolenaar 2501f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_ATTR, 2502f9cc9f20SBram Moolenaar sgp->sg_cterm, NULL, "cterm"); 2503f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_INT, 2504f9cc9f20SBram Moolenaar sgp->sg_cterm_fg, NULL, "ctermfg"); 2505f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_INT, 2506f9cc9f20SBram Moolenaar sgp->sg_cterm_bg, NULL, "ctermbg"); 2507f9cc9f20SBram Moolenaar 2508f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 2509f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_ATTR, 2510f9cc9f20SBram Moolenaar sgp->sg_gui, NULL, "gui"); 2511f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_STRING, 2512f9cc9f20SBram Moolenaar 0, sgp->sg_gui_fg_name, "guifg"); 2513f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_STRING, 2514f9cc9f20SBram Moolenaar 0, sgp->sg_gui_bg_name, "guibg"); 2515f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_STRING, 2516f9cc9f20SBram Moolenaar 0, sgp->sg_gui_sp_name, "guisp"); 2517f9cc9f20SBram Moolenaar #endif 2518f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2519f9cc9f20SBram Moolenaar didh = highlight_list_arg(id, didh, LIST_STRING, 2520f9cc9f20SBram Moolenaar 0, sgp->sg_font_name, "font"); 2521f9cc9f20SBram Moolenaar #endif 2522f9cc9f20SBram Moolenaar 2523f9cc9f20SBram Moolenaar if (sgp->sg_link && !got_int) 2524f9cc9f20SBram Moolenaar { 2525f9cc9f20SBram Moolenaar (void)syn_list_header(didh, 9999, id); 2526f9cc9f20SBram Moolenaar didh = TRUE; 2527f9cc9f20SBram Moolenaar msg_puts_attr("links to", HL_ATTR(HLF_D)); 2528f9cc9f20SBram Moolenaar msg_putchar(' '); 2529f9cc9f20SBram Moolenaar msg_outtrans(HL_TABLE()[HL_TABLE()[id - 1].sg_link - 1].sg_name); 2530f9cc9f20SBram Moolenaar } 2531f9cc9f20SBram Moolenaar 2532f9cc9f20SBram Moolenaar if (!didh) 2533f9cc9f20SBram Moolenaar highlight_list_arg(id, didh, LIST_STRING, 0, (char_u *)"cleared", ""); 2534f9cc9f20SBram Moolenaar #ifdef FEAT_EVAL 2535f9cc9f20SBram Moolenaar if (p_verbose > 0) 2536f9cc9f20SBram Moolenaar last_set_msg(sgp->sg_script_ctx); 2537f9cc9f20SBram Moolenaar #endif 2538f9cc9f20SBram Moolenaar } 2539f9cc9f20SBram Moolenaar 2540f9cc9f20SBram Moolenaar static int 2541f9cc9f20SBram Moolenaar highlight_list_arg( 2542f9cc9f20SBram Moolenaar int id, 2543f9cc9f20SBram Moolenaar int didh, 2544f9cc9f20SBram Moolenaar int type, 2545f9cc9f20SBram Moolenaar int iarg, 2546f9cc9f20SBram Moolenaar char_u *sarg, 2547f9cc9f20SBram Moolenaar char *name) 2548f9cc9f20SBram Moolenaar { 2549f9cc9f20SBram Moolenaar char_u buf[100]; 2550f9cc9f20SBram Moolenaar char_u *ts; 2551f9cc9f20SBram Moolenaar int i; 2552f9cc9f20SBram Moolenaar 2553f9cc9f20SBram Moolenaar if (got_int) 2554f9cc9f20SBram Moolenaar return FALSE; 2555f9cc9f20SBram Moolenaar if (type == LIST_STRING ? (sarg != NULL) : (iarg != 0)) 2556f9cc9f20SBram Moolenaar { 2557f9cc9f20SBram Moolenaar ts = buf; 2558f9cc9f20SBram Moolenaar if (type == LIST_INT) 2559f9cc9f20SBram Moolenaar sprintf((char *)buf, "%d", iarg - 1); 2560f9cc9f20SBram Moolenaar else if (type == LIST_STRING) 2561f9cc9f20SBram Moolenaar ts = sarg; 2562f9cc9f20SBram Moolenaar else // type == LIST_ATTR 2563f9cc9f20SBram Moolenaar { 2564f9cc9f20SBram Moolenaar buf[0] = NUL; 2565f9cc9f20SBram Moolenaar for (i = 0; hl_attr_table[i] != 0; ++i) 2566f9cc9f20SBram Moolenaar { 2567f9cc9f20SBram Moolenaar if (iarg & hl_attr_table[i]) 2568f9cc9f20SBram Moolenaar { 2569f9cc9f20SBram Moolenaar if (buf[0] != NUL) 2570f9cc9f20SBram Moolenaar vim_strcat(buf, (char_u *)",", 100); 2571f9cc9f20SBram Moolenaar vim_strcat(buf, (char_u *)hl_name_table[i], 100); 2572f9cc9f20SBram Moolenaar iarg &= ~hl_attr_table[i]; // don't want "inverse" 2573f9cc9f20SBram Moolenaar } 2574f9cc9f20SBram Moolenaar } 2575f9cc9f20SBram Moolenaar } 2576f9cc9f20SBram Moolenaar 2577f9cc9f20SBram Moolenaar (void)syn_list_header(didh, 2578f9cc9f20SBram Moolenaar (int)(vim_strsize(ts) + STRLEN(name) + 1), id); 2579f9cc9f20SBram Moolenaar didh = TRUE; 2580f9cc9f20SBram Moolenaar if (!got_int) 2581f9cc9f20SBram Moolenaar { 2582f9cc9f20SBram Moolenaar if (*name != NUL) 2583f9cc9f20SBram Moolenaar { 2584f9cc9f20SBram Moolenaar msg_puts_attr(name, HL_ATTR(HLF_D)); 2585f9cc9f20SBram Moolenaar msg_puts_attr("=", HL_ATTR(HLF_D)); 2586f9cc9f20SBram Moolenaar } 2587f9cc9f20SBram Moolenaar msg_outtrans(ts); 2588f9cc9f20SBram Moolenaar } 2589f9cc9f20SBram Moolenaar } 2590f9cc9f20SBram Moolenaar return didh; 2591f9cc9f20SBram Moolenaar } 2592f9cc9f20SBram Moolenaar 2593f9cc9f20SBram Moolenaar #if (((defined(FEAT_EVAL) || defined(FEAT_PRINTER))) && defined(FEAT_SYN_HL)) || defined(PROTO) 2594f9cc9f20SBram Moolenaar /* 2595f9cc9f20SBram Moolenaar * Return "1" if highlight group "id" has attribute "flag". 2596f9cc9f20SBram Moolenaar * Return NULL otherwise. 2597f9cc9f20SBram Moolenaar */ 2598f9cc9f20SBram Moolenaar char_u * 2599f9cc9f20SBram Moolenaar highlight_has_attr( 2600f9cc9f20SBram Moolenaar int id, 2601f9cc9f20SBram Moolenaar int flag, 2602f9cc9f20SBram Moolenaar int modec) // 'g' for GUI, 'c' for cterm, 't' for term 2603f9cc9f20SBram Moolenaar { 2604f9cc9f20SBram Moolenaar int attr; 2605f9cc9f20SBram Moolenaar 2606f9cc9f20SBram Moolenaar if (id <= 0 || id > highlight_ga.ga_len) 2607f9cc9f20SBram Moolenaar return NULL; 2608f9cc9f20SBram Moolenaar 2609f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_EVAL) 2610f9cc9f20SBram Moolenaar if (modec == 'g') 2611f9cc9f20SBram Moolenaar attr = HL_TABLE()[id - 1].sg_gui; 2612f9cc9f20SBram Moolenaar else 2613f9cc9f20SBram Moolenaar #endif 2614f9cc9f20SBram Moolenaar if (modec == 'c') 2615f9cc9f20SBram Moolenaar attr = HL_TABLE()[id - 1].sg_cterm; 2616f9cc9f20SBram Moolenaar else 2617f9cc9f20SBram Moolenaar attr = HL_TABLE()[id - 1].sg_term; 2618f9cc9f20SBram Moolenaar 2619f9cc9f20SBram Moolenaar if (attr & flag) 2620f9cc9f20SBram Moolenaar return (char_u *)"1"; 2621f9cc9f20SBram Moolenaar return NULL; 2622f9cc9f20SBram Moolenaar } 2623f9cc9f20SBram Moolenaar #endif 2624f9cc9f20SBram Moolenaar 2625f9cc9f20SBram Moolenaar #if (defined(FEAT_SYN_HL) && defined(FEAT_EVAL)) || defined(PROTO) 2626f9cc9f20SBram Moolenaar /* 2627f9cc9f20SBram Moolenaar * Return color name of highlight group "id". 2628f9cc9f20SBram Moolenaar */ 2629f9cc9f20SBram Moolenaar char_u * 2630f9cc9f20SBram Moolenaar highlight_color( 2631f9cc9f20SBram Moolenaar int id, 2632f9cc9f20SBram Moolenaar char_u *what, // "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" 2633f9cc9f20SBram Moolenaar int modec) // 'g' for GUI, 'c' for cterm, 't' for term 2634f9cc9f20SBram Moolenaar { 2635f9cc9f20SBram Moolenaar static char_u name[20]; 2636f9cc9f20SBram Moolenaar int n; 2637f9cc9f20SBram Moolenaar int fg = FALSE; 2638f9cc9f20SBram Moolenaar int sp = FALSE; 2639f9cc9f20SBram Moolenaar int font = FALSE; 2640f9cc9f20SBram Moolenaar 2641f9cc9f20SBram Moolenaar if (id <= 0 || id > highlight_ga.ga_len) 2642f9cc9f20SBram Moolenaar return NULL; 2643f9cc9f20SBram Moolenaar 2644f9cc9f20SBram Moolenaar if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'g') 2645f9cc9f20SBram Moolenaar fg = TRUE; 2646f9cc9f20SBram Moolenaar else if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'o' 2647f9cc9f20SBram Moolenaar && TOLOWER_ASC(what[2]) == 'n' && TOLOWER_ASC(what[3]) == 't') 2648f9cc9f20SBram Moolenaar font = TRUE; 2649f9cc9f20SBram Moolenaar else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p') 2650f9cc9f20SBram Moolenaar sp = TRUE; 2651f9cc9f20SBram Moolenaar else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g')) 2652f9cc9f20SBram Moolenaar return NULL; 2653f9cc9f20SBram Moolenaar if (modec == 'g') 2654f9cc9f20SBram Moolenaar { 2655f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 2656f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 2657f9cc9f20SBram Moolenaar // return font name 2658f9cc9f20SBram Moolenaar if (font) 2659f9cc9f20SBram Moolenaar return HL_TABLE()[id - 1].sg_font_name; 2660f9cc9f20SBram Moolenaar # endif 2661f9cc9f20SBram Moolenaar 2662f9cc9f20SBram Moolenaar // return #RRGGBB form (only possible when GUI is running) 2663f9cc9f20SBram Moolenaar if ((USE_24BIT) && what[2] == '#') 2664f9cc9f20SBram Moolenaar { 2665f9cc9f20SBram Moolenaar guicolor_T color; 2666f9cc9f20SBram Moolenaar long_u rgb; 2667f9cc9f20SBram Moolenaar static char_u buf[10]; 2668f9cc9f20SBram Moolenaar 2669f9cc9f20SBram Moolenaar if (fg) 2670f9cc9f20SBram Moolenaar color = HL_TABLE()[id - 1].sg_gui_fg; 2671f9cc9f20SBram Moolenaar else if (sp) 2672f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 2673f9cc9f20SBram Moolenaar color = HL_TABLE()[id - 1].sg_gui_sp; 2674f9cc9f20SBram Moolenaar # else 2675f9cc9f20SBram Moolenaar color = INVALCOLOR; 2676f9cc9f20SBram Moolenaar # endif 2677f9cc9f20SBram Moolenaar else 2678f9cc9f20SBram Moolenaar color = HL_TABLE()[id - 1].sg_gui_bg; 2679f9cc9f20SBram Moolenaar if (color == INVALCOLOR) 2680f9cc9f20SBram Moolenaar return NULL; 2681f9cc9f20SBram Moolenaar rgb = (long_u)GUI_MCH_GET_RGB(color); 2682f9cc9f20SBram Moolenaar sprintf((char *)buf, "#%02x%02x%02x", 2683f9cc9f20SBram Moolenaar (unsigned)(rgb >> 16), 2684f9cc9f20SBram Moolenaar (unsigned)(rgb >> 8) & 255, 2685f9cc9f20SBram Moolenaar (unsigned)rgb & 255); 2686f9cc9f20SBram Moolenaar return buf; 2687f9cc9f20SBram Moolenaar } 2688f9cc9f20SBram Moolenaar # endif 2689f9cc9f20SBram Moolenaar if (fg) 2690f9cc9f20SBram Moolenaar return (HL_TABLE()[id - 1].sg_gui_fg_name); 2691f9cc9f20SBram Moolenaar if (sp) 2692f9cc9f20SBram Moolenaar return (HL_TABLE()[id - 1].sg_gui_sp_name); 2693f9cc9f20SBram Moolenaar return (HL_TABLE()[id - 1].sg_gui_bg_name); 2694f9cc9f20SBram Moolenaar } 2695f9cc9f20SBram Moolenaar if (font || sp) 2696f9cc9f20SBram Moolenaar return NULL; 2697f9cc9f20SBram Moolenaar if (modec == 'c') 2698f9cc9f20SBram Moolenaar { 2699f9cc9f20SBram Moolenaar if (fg) 2700f9cc9f20SBram Moolenaar n = HL_TABLE()[id - 1].sg_cterm_fg - 1; 2701f9cc9f20SBram Moolenaar else 2702f9cc9f20SBram Moolenaar n = HL_TABLE()[id - 1].sg_cterm_bg - 1; 2703f9cc9f20SBram Moolenaar if (n < 0) 2704f9cc9f20SBram Moolenaar return NULL; 2705f9cc9f20SBram Moolenaar sprintf((char *)name, "%d", n); 2706f9cc9f20SBram Moolenaar return name; 2707f9cc9f20SBram Moolenaar } 2708f9cc9f20SBram Moolenaar // term doesn't have color 2709f9cc9f20SBram Moolenaar return NULL; 2710f9cc9f20SBram Moolenaar } 2711f9cc9f20SBram Moolenaar #endif 2712f9cc9f20SBram Moolenaar 2713f9cc9f20SBram Moolenaar #if (defined(FEAT_SYN_HL) \ 2714f9cc9f20SBram Moolenaar && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)) \ 2715f9cc9f20SBram Moolenaar && defined(FEAT_PRINTER)) || defined(PROTO) 2716f9cc9f20SBram Moolenaar /* 2717f9cc9f20SBram Moolenaar * Return color name of highlight group "id" as RGB value. 2718f9cc9f20SBram Moolenaar */ 2719f9cc9f20SBram Moolenaar long_u 2720f9cc9f20SBram Moolenaar highlight_gui_color_rgb( 2721f9cc9f20SBram Moolenaar int id, 2722f9cc9f20SBram Moolenaar int fg) // TRUE = fg, FALSE = bg 2723f9cc9f20SBram Moolenaar { 2724f9cc9f20SBram Moolenaar guicolor_T color; 2725f9cc9f20SBram Moolenaar 2726f9cc9f20SBram Moolenaar if (id <= 0 || id > highlight_ga.ga_len) 2727f9cc9f20SBram Moolenaar return 0L; 2728f9cc9f20SBram Moolenaar 2729f9cc9f20SBram Moolenaar if (fg) 2730f9cc9f20SBram Moolenaar color = HL_TABLE()[id - 1].sg_gui_fg; 2731f9cc9f20SBram Moolenaar else 2732f9cc9f20SBram Moolenaar color = HL_TABLE()[id - 1].sg_gui_bg; 2733f9cc9f20SBram Moolenaar 2734f9cc9f20SBram Moolenaar if (color == INVALCOLOR) 2735f9cc9f20SBram Moolenaar return 0L; 2736f9cc9f20SBram Moolenaar 2737f9cc9f20SBram Moolenaar return GUI_MCH_GET_RGB(color); 2738f9cc9f20SBram Moolenaar } 2739f9cc9f20SBram Moolenaar #endif 2740f9cc9f20SBram Moolenaar 2741f9cc9f20SBram Moolenaar /* 2742f9cc9f20SBram Moolenaar * Output the syntax list header. 2743f9cc9f20SBram Moolenaar * Return TRUE when started a new line. 2744f9cc9f20SBram Moolenaar */ 2745f9cc9f20SBram Moolenaar int 2746f9cc9f20SBram Moolenaar syn_list_header( 2747f9cc9f20SBram Moolenaar int did_header, // did header already 2748f9cc9f20SBram Moolenaar int outlen, // length of string that comes 2749f9cc9f20SBram Moolenaar int id) // highlight group id 2750f9cc9f20SBram Moolenaar { 2751f9cc9f20SBram Moolenaar int endcol = 19; 2752f9cc9f20SBram Moolenaar int newline = TRUE; 2753f9cc9f20SBram Moolenaar int name_col = 0; 2754f9cc9f20SBram Moolenaar 2755f9cc9f20SBram Moolenaar if (!did_header) 2756f9cc9f20SBram Moolenaar { 2757f9cc9f20SBram Moolenaar msg_putchar('\n'); 2758f9cc9f20SBram Moolenaar if (got_int) 2759f9cc9f20SBram Moolenaar return TRUE; 2760f9cc9f20SBram Moolenaar msg_outtrans(HL_TABLE()[id - 1].sg_name); 2761f9cc9f20SBram Moolenaar name_col = msg_col; 2762f9cc9f20SBram Moolenaar endcol = 15; 2763f9cc9f20SBram Moolenaar } 2764f9cc9f20SBram Moolenaar else if (msg_col + outlen + 1 >= Columns) 2765f9cc9f20SBram Moolenaar { 2766f9cc9f20SBram Moolenaar msg_putchar('\n'); 2767f9cc9f20SBram Moolenaar if (got_int) 2768f9cc9f20SBram Moolenaar return TRUE; 2769f9cc9f20SBram Moolenaar } 2770f9cc9f20SBram Moolenaar else 2771f9cc9f20SBram Moolenaar { 2772f9cc9f20SBram Moolenaar if (msg_col >= endcol) // wrap around is like starting a new line 2773f9cc9f20SBram Moolenaar newline = FALSE; 2774f9cc9f20SBram Moolenaar } 2775f9cc9f20SBram Moolenaar 2776f9cc9f20SBram Moolenaar if (msg_col >= endcol) // output at least one space 2777f9cc9f20SBram Moolenaar endcol = msg_col + 1; 2778f9cc9f20SBram Moolenaar if (Columns <= endcol) // avoid hang for tiny window 2779f9cc9f20SBram Moolenaar endcol = Columns - 1; 2780f9cc9f20SBram Moolenaar 2781f9cc9f20SBram Moolenaar msg_advance(endcol); 2782f9cc9f20SBram Moolenaar 2783f9cc9f20SBram Moolenaar // Show "xxx" with the attributes. 2784f9cc9f20SBram Moolenaar if (!did_header) 2785f9cc9f20SBram Moolenaar { 2786f9cc9f20SBram Moolenaar if (endcol == Columns - 1 && endcol <= name_col) 2787f9cc9f20SBram Moolenaar msg_putchar(' '); 2788f9cc9f20SBram Moolenaar msg_puts_attr("xxx", syn_id2attr(id)); 2789f9cc9f20SBram Moolenaar msg_putchar(' '); 2790f9cc9f20SBram Moolenaar } 2791f9cc9f20SBram Moolenaar 2792f9cc9f20SBram Moolenaar return newline; 2793f9cc9f20SBram Moolenaar } 2794f9cc9f20SBram Moolenaar 2795f9cc9f20SBram Moolenaar /* 2796f9cc9f20SBram Moolenaar * Set the attribute numbers for a highlight group. 2797f9cc9f20SBram Moolenaar * Called after one of the attributes has changed. 2798f9cc9f20SBram Moolenaar */ 2799f9cc9f20SBram Moolenaar static void 2800f9cc9f20SBram Moolenaar set_hl_attr( 2801f9cc9f20SBram Moolenaar int idx) // index in array 2802f9cc9f20SBram Moolenaar { 2803f9cc9f20SBram Moolenaar attrentry_T at_en; 2804f9cc9f20SBram Moolenaar hl_group_T *sgp = HL_TABLE() + idx; 2805f9cc9f20SBram Moolenaar 2806f9cc9f20SBram Moolenaar // The "Normal" group doesn't need an attribute number 2807f9cc9f20SBram Moolenaar if (sgp->sg_name_u != NULL && STRCMP(sgp->sg_name_u, "NORMAL") == 0) 2808f9cc9f20SBram Moolenaar return; 2809f9cc9f20SBram Moolenaar 2810f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 2811f9cc9f20SBram Moolenaar /* 2812f9cc9f20SBram Moolenaar * For the GUI mode: If there are other than "normal" highlighting 2813f9cc9f20SBram Moolenaar * attributes, need to allocate an attr number. 2814f9cc9f20SBram Moolenaar */ 2815f9cc9f20SBram Moolenaar if (sgp->sg_gui_fg == INVALCOLOR 2816f9cc9f20SBram Moolenaar && sgp->sg_gui_bg == INVALCOLOR 2817f9cc9f20SBram Moolenaar && sgp->sg_gui_sp == INVALCOLOR 2818f9cc9f20SBram Moolenaar && sgp->sg_font == NOFONT 2819f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 2820f9cc9f20SBram Moolenaar && sgp->sg_fontset == NOFONTSET 2821f9cc9f20SBram Moolenaar # endif 2822f9cc9f20SBram Moolenaar ) 2823f9cc9f20SBram Moolenaar { 2824f9cc9f20SBram Moolenaar sgp->sg_gui_attr = sgp->sg_gui; 2825f9cc9f20SBram Moolenaar } 2826f9cc9f20SBram Moolenaar else 2827f9cc9f20SBram Moolenaar { 2828f9cc9f20SBram Moolenaar at_en.ae_attr = sgp->sg_gui; 2829f9cc9f20SBram Moolenaar at_en.ae_u.gui.fg_color = sgp->sg_gui_fg; 2830f9cc9f20SBram Moolenaar at_en.ae_u.gui.bg_color = sgp->sg_gui_bg; 2831f9cc9f20SBram Moolenaar at_en.ae_u.gui.sp_color = sgp->sg_gui_sp; 2832f9cc9f20SBram Moolenaar at_en.ae_u.gui.font = sgp->sg_font; 2833f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 2834f9cc9f20SBram Moolenaar at_en.ae_u.gui.fontset = sgp->sg_fontset; 2835f9cc9f20SBram Moolenaar # endif 2836f9cc9f20SBram Moolenaar sgp->sg_gui_attr = get_attr_entry(&gui_attr_table, &at_en); 2837f9cc9f20SBram Moolenaar } 2838f9cc9f20SBram Moolenaar #endif 2839f9cc9f20SBram Moolenaar /* 2840f9cc9f20SBram Moolenaar * For the term mode: If there are other than "normal" highlighting 2841f9cc9f20SBram Moolenaar * attributes, need to allocate an attr number. 2842f9cc9f20SBram Moolenaar */ 2843f9cc9f20SBram Moolenaar if (sgp->sg_start == NULL && sgp->sg_stop == NULL) 2844f9cc9f20SBram Moolenaar sgp->sg_term_attr = sgp->sg_term; 2845f9cc9f20SBram Moolenaar else 2846f9cc9f20SBram Moolenaar { 2847f9cc9f20SBram Moolenaar at_en.ae_attr = sgp->sg_term; 2848f9cc9f20SBram Moolenaar at_en.ae_u.term.start = sgp->sg_start; 2849f9cc9f20SBram Moolenaar at_en.ae_u.term.stop = sgp->sg_stop; 2850f9cc9f20SBram Moolenaar sgp->sg_term_attr = get_attr_entry(&term_attr_table, &at_en); 2851f9cc9f20SBram Moolenaar } 2852f9cc9f20SBram Moolenaar 2853f9cc9f20SBram Moolenaar /* 2854f9cc9f20SBram Moolenaar * For the color term mode: If there are other than "normal" 2855f9cc9f20SBram Moolenaar * highlighting attributes, need to allocate an attr number. 2856f9cc9f20SBram Moolenaar */ 2857f9cc9f20SBram Moolenaar if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0 2858f9cc9f20SBram Moolenaar # ifdef FEAT_TERMGUICOLORS 2859f9cc9f20SBram Moolenaar && sgp->sg_gui_fg == INVALCOLOR 2860f9cc9f20SBram Moolenaar && sgp->sg_gui_bg == INVALCOLOR 2861f9cc9f20SBram Moolenaar # endif 2862f9cc9f20SBram Moolenaar ) 2863f9cc9f20SBram Moolenaar sgp->sg_cterm_attr = sgp->sg_cterm; 2864f9cc9f20SBram Moolenaar else 2865f9cc9f20SBram Moolenaar { 2866f9cc9f20SBram Moolenaar at_en.ae_attr = sgp->sg_cterm; 2867f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg; 2868f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg; 2869f9cc9f20SBram Moolenaar # ifdef FEAT_TERMGUICOLORS 2870f9cc9f20SBram Moolenaar # ifdef MSWIN 2871f9cc9f20SBram Moolenaar # ifdef VIMDLL 2872f9cc9f20SBram Moolenaar // Only when not using the GUI. 2873f9cc9f20SBram Moolenaar if (!gui.in_use && !gui.starting) 2874f9cc9f20SBram Moolenaar # endif 2875f9cc9f20SBram Moolenaar { 2876f9cc9f20SBram Moolenaar int id; 2877f9cc9f20SBram Moolenaar guicolor_T fg, bg; 2878f9cc9f20SBram Moolenaar 2879f9cc9f20SBram Moolenaar id = syn_name2id((char_u *)"Normal"); 2880f9cc9f20SBram Moolenaar if (id > 0) 2881f9cc9f20SBram Moolenaar { 2882f9cc9f20SBram Moolenaar syn_id2colors(id, &fg, &bg); 2883f9cc9f20SBram Moolenaar if (sgp->sg_gui_fg == INVALCOLOR) 2884f9cc9f20SBram Moolenaar sgp->sg_gui_fg = fg; 2885f9cc9f20SBram Moolenaar if (sgp->sg_gui_bg == INVALCOLOR) 2886f9cc9f20SBram Moolenaar sgp->sg_gui_bg = bg; 2887f9cc9f20SBram Moolenaar } 2888f9cc9f20SBram Moolenaar 2889f9cc9f20SBram Moolenaar } 2890f9cc9f20SBram Moolenaar # endif 2891f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_rgb = GUI_MCH_GET_RGB2(sgp->sg_gui_fg); 2892f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_rgb = GUI_MCH_GET_RGB2(sgp->sg_gui_bg); 2893f9cc9f20SBram Moolenaar if (at_en.ae_u.cterm.fg_rgb == INVALCOLOR 2894f9cc9f20SBram Moolenaar && at_en.ae_u.cterm.bg_rgb == INVALCOLOR) 2895f9cc9f20SBram Moolenaar { 2896f9cc9f20SBram Moolenaar // If both fg and bg are invalid fall back to the cterm colors. 2897f9cc9f20SBram Moolenaar // Helps when the GUI only uses an attribute, e.g. undercurl. 2898f9cc9f20SBram Moolenaar at_en.ae_u.cterm.fg_rgb = CTERMCOLOR; 2899f9cc9f20SBram Moolenaar at_en.ae_u.cterm.bg_rgb = CTERMCOLOR; 2900f9cc9f20SBram Moolenaar } 2901f9cc9f20SBram Moolenaar # endif 2902f9cc9f20SBram Moolenaar sgp->sg_cterm_attr = get_attr_entry(&cterm_attr_table, &at_en); 2903f9cc9f20SBram Moolenaar } 2904f9cc9f20SBram Moolenaar } 2905f9cc9f20SBram Moolenaar 2906f9cc9f20SBram Moolenaar /* 2907f9cc9f20SBram Moolenaar * Lookup a highlight group name and return its ID. 2908f9cc9f20SBram Moolenaar * If it is not found, 0 is returned. 2909f9cc9f20SBram Moolenaar */ 2910f9cc9f20SBram Moolenaar int 2911f9cc9f20SBram Moolenaar syn_name2id(char_u *name) 2912f9cc9f20SBram Moolenaar { 2913f9cc9f20SBram Moolenaar int i; 2914f9cc9f20SBram Moolenaar char_u name_u[200]; 2915f9cc9f20SBram Moolenaar 2916f9cc9f20SBram Moolenaar // Avoid using stricmp() too much, it's slow on some systems 2917f9cc9f20SBram Moolenaar // Avoid alloc()/free(), these are slow too. ID names over 200 chars 2918f9cc9f20SBram Moolenaar // don't deserve to be found! 2919f9cc9f20SBram Moolenaar vim_strncpy(name_u, name, 199); 2920f9cc9f20SBram Moolenaar vim_strup(name_u); 2921f9cc9f20SBram Moolenaar for (i = highlight_ga.ga_len; --i >= 0; ) 2922f9cc9f20SBram Moolenaar if (HL_TABLE()[i].sg_name_u != NULL 2923f9cc9f20SBram Moolenaar && STRCMP(name_u, HL_TABLE()[i].sg_name_u) == 0) 2924f9cc9f20SBram Moolenaar break; 2925f9cc9f20SBram Moolenaar return i + 1; 2926f9cc9f20SBram Moolenaar } 2927f9cc9f20SBram Moolenaar 2928f9cc9f20SBram Moolenaar /* 2929f9cc9f20SBram Moolenaar * Lookup a highlight group name and return its attributes. 2930f9cc9f20SBram Moolenaar * Return zero if not found. 2931f9cc9f20SBram Moolenaar */ 2932f9cc9f20SBram Moolenaar int 2933f9cc9f20SBram Moolenaar syn_name2attr(char_u *name) 2934f9cc9f20SBram Moolenaar { 2935f9cc9f20SBram Moolenaar int id = syn_name2id(name); 2936f9cc9f20SBram Moolenaar 2937f9cc9f20SBram Moolenaar if (id != 0) 2938f9cc9f20SBram Moolenaar return syn_id2attr(id); 2939f9cc9f20SBram Moolenaar return 0; 2940f9cc9f20SBram Moolenaar } 2941f9cc9f20SBram Moolenaar 2942f9cc9f20SBram Moolenaar #if defined(FEAT_EVAL) || defined(PROTO) 2943f9cc9f20SBram Moolenaar /* 2944f9cc9f20SBram Moolenaar * Return TRUE if highlight group "name" exists. 2945f9cc9f20SBram Moolenaar */ 2946f9cc9f20SBram Moolenaar int 2947f9cc9f20SBram Moolenaar highlight_exists(char_u *name) 2948f9cc9f20SBram Moolenaar { 2949f9cc9f20SBram Moolenaar return (syn_name2id(name) > 0); 2950f9cc9f20SBram Moolenaar } 2951f9cc9f20SBram Moolenaar 2952f9cc9f20SBram Moolenaar # if defined(FEAT_SEARCH_EXTRA) || defined(PROTO) 2953f9cc9f20SBram Moolenaar /* 2954f9cc9f20SBram Moolenaar * Return the name of highlight group "id". 2955f9cc9f20SBram Moolenaar * When not a valid ID return an empty string. 2956f9cc9f20SBram Moolenaar */ 2957f9cc9f20SBram Moolenaar char_u * 2958f9cc9f20SBram Moolenaar syn_id2name(int id) 2959f9cc9f20SBram Moolenaar { 2960f9cc9f20SBram Moolenaar if (id <= 0 || id > highlight_ga.ga_len) 2961f9cc9f20SBram Moolenaar return (char_u *)""; 2962f9cc9f20SBram Moolenaar return HL_TABLE()[id - 1].sg_name; 2963f9cc9f20SBram Moolenaar } 2964f9cc9f20SBram Moolenaar # endif 2965f9cc9f20SBram Moolenaar #endif 2966f9cc9f20SBram Moolenaar 2967f9cc9f20SBram Moolenaar /* 2968f9cc9f20SBram Moolenaar * Like syn_name2id(), but take a pointer + length argument. 2969f9cc9f20SBram Moolenaar */ 2970f9cc9f20SBram Moolenaar int 2971f9cc9f20SBram Moolenaar syn_namen2id(char_u *linep, int len) 2972f9cc9f20SBram Moolenaar { 2973f9cc9f20SBram Moolenaar char_u *name; 2974f9cc9f20SBram Moolenaar int id = 0; 2975f9cc9f20SBram Moolenaar 2976f9cc9f20SBram Moolenaar name = vim_strnsave(linep, len); 2977f9cc9f20SBram Moolenaar if (name != NULL) 2978f9cc9f20SBram Moolenaar { 2979f9cc9f20SBram Moolenaar id = syn_name2id(name); 2980f9cc9f20SBram Moolenaar vim_free(name); 2981f9cc9f20SBram Moolenaar } 2982f9cc9f20SBram Moolenaar return id; 2983f9cc9f20SBram Moolenaar } 2984f9cc9f20SBram Moolenaar 2985f9cc9f20SBram Moolenaar /* 2986f9cc9f20SBram Moolenaar * Find highlight group name in the table and return its ID. 2987f9cc9f20SBram Moolenaar * The argument is a pointer to the name and the length of the name. 2988f9cc9f20SBram Moolenaar * If it doesn't exist yet, a new entry is created. 2989f9cc9f20SBram Moolenaar * Return 0 for failure. 2990f9cc9f20SBram Moolenaar */ 2991f9cc9f20SBram Moolenaar int 2992f9cc9f20SBram Moolenaar syn_check_group(char_u *pp, int len) 2993f9cc9f20SBram Moolenaar { 2994f9cc9f20SBram Moolenaar int id; 2995f9cc9f20SBram Moolenaar char_u *name; 2996f9cc9f20SBram Moolenaar 2997f9cc9f20SBram Moolenaar name = vim_strnsave(pp, len); 2998f9cc9f20SBram Moolenaar if (name == NULL) 2999f9cc9f20SBram Moolenaar return 0; 3000f9cc9f20SBram Moolenaar 3001f9cc9f20SBram Moolenaar id = syn_name2id(name); 3002f9cc9f20SBram Moolenaar if (id == 0) // doesn't exist yet 3003f9cc9f20SBram Moolenaar id = syn_add_group(name); 3004f9cc9f20SBram Moolenaar else 3005f9cc9f20SBram Moolenaar vim_free(name); 3006f9cc9f20SBram Moolenaar return id; 3007f9cc9f20SBram Moolenaar } 3008f9cc9f20SBram Moolenaar 3009f9cc9f20SBram Moolenaar /* 3010f9cc9f20SBram Moolenaar * Add new highlight group and return its ID. 3011f9cc9f20SBram Moolenaar * "name" must be an allocated string, it will be consumed. 3012f9cc9f20SBram Moolenaar * Return 0 for failure. 3013f9cc9f20SBram Moolenaar */ 3014f9cc9f20SBram Moolenaar static int 3015f9cc9f20SBram Moolenaar syn_add_group(char_u *name) 3016f9cc9f20SBram Moolenaar { 3017f9cc9f20SBram Moolenaar char_u *p; 3018f9cc9f20SBram Moolenaar 3019f9cc9f20SBram Moolenaar // Check that the name is ASCII letters, digits and underscore. 3020f9cc9f20SBram Moolenaar for (p = name; *p != NUL; ++p) 3021f9cc9f20SBram Moolenaar { 3022f9cc9f20SBram Moolenaar if (!vim_isprintc(*p)) 3023f9cc9f20SBram Moolenaar { 3024f9cc9f20SBram Moolenaar emsg(_("E669: Unprintable character in group name")); 3025f9cc9f20SBram Moolenaar vim_free(name); 3026f9cc9f20SBram Moolenaar return 0; 3027f9cc9f20SBram Moolenaar } 3028f9cc9f20SBram Moolenaar else if (!ASCII_ISALNUM(*p) && *p != '_') 3029f9cc9f20SBram Moolenaar { 3030f9cc9f20SBram Moolenaar // This is an error, but since there previously was no check only 3031f9cc9f20SBram Moolenaar // give a warning. 3032f9cc9f20SBram Moolenaar msg_source(HL_ATTR(HLF_W)); 3033f9cc9f20SBram Moolenaar msg(_("W18: Invalid character in group name")); 3034f9cc9f20SBram Moolenaar break; 3035f9cc9f20SBram Moolenaar } 3036f9cc9f20SBram Moolenaar } 3037f9cc9f20SBram Moolenaar 3038f9cc9f20SBram Moolenaar /* 3039f9cc9f20SBram Moolenaar * First call for this growarray: init growing array. 3040f9cc9f20SBram Moolenaar */ 3041f9cc9f20SBram Moolenaar if (highlight_ga.ga_data == NULL) 3042f9cc9f20SBram Moolenaar { 3043f9cc9f20SBram Moolenaar highlight_ga.ga_itemsize = sizeof(hl_group_T); 3044f9cc9f20SBram Moolenaar highlight_ga.ga_growsize = 10; 3045f9cc9f20SBram Moolenaar } 3046f9cc9f20SBram Moolenaar 3047f9cc9f20SBram Moolenaar if (highlight_ga.ga_len >= MAX_HL_ID) 3048f9cc9f20SBram Moolenaar { 3049f9cc9f20SBram Moolenaar emsg(_("E849: Too many highlight and syntax groups")); 3050f9cc9f20SBram Moolenaar vim_free(name); 3051f9cc9f20SBram Moolenaar return 0; 3052f9cc9f20SBram Moolenaar } 3053f9cc9f20SBram Moolenaar 3054f9cc9f20SBram Moolenaar /* 3055f9cc9f20SBram Moolenaar * Make room for at least one other syntax_highlight entry. 3056f9cc9f20SBram Moolenaar */ 3057f9cc9f20SBram Moolenaar if (ga_grow(&highlight_ga, 1) == FAIL) 3058f9cc9f20SBram Moolenaar { 3059f9cc9f20SBram Moolenaar vim_free(name); 3060f9cc9f20SBram Moolenaar return 0; 3061f9cc9f20SBram Moolenaar } 3062f9cc9f20SBram Moolenaar 3063f9cc9f20SBram Moolenaar vim_memset(&(HL_TABLE()[highlight_ga.ga_len]), 0, sizeof(hl_group_T)); 3064f9cc9f20SBram Moolenaar HL_TABLE()[highlight_ga.ga_len].sg_name = name; 3065f9cc9f20SBram Moolenaar HL_TABLE()[highlight_ga.ga_len].sg_name_u = vim_strsave_up(name); 3066f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) 3067f9cc9f20SBram Moolenaar HL_TABLE()[highlight_ga.ga_len].sg_gui_bg = INVALCOLOR; 3068f9cc9f20SBram Moolenaar HL_TABLE()[highlight_ga.ga_len].sg_gui_fg = INVALCOLOR; 3069f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 3070f9cc9f20SBram Moolenaar HL_TABLE()[highlight_ga.ga_len].sg_gui_sp = INVALCOLOR; 3071f9cc9f20SBram Moolenaar # endif 3072f9cc9f20SBram Moolenaar #endif 3073f9cc9f20SBram Moolenaar ++highlight_ga.ga_len; 3074f9cc9f20SBram Moolenaar 3075f9cc9f20SBram Moolenaar return highlight_ga.ga_len; // ID is index plus one 3076f9cc9f20SBram Moolenaar } 3077f9cc9f20SBram Moolenaar 3078f9cc9f20SBram Moolenaar /* 3079f9cc9f20SBram Moolenaar * When, just after calling syn_add_group(), an error is discovered, this 3080f9cc9f20SBram Moolenaar * function deletes the new name. 3081f9cc9f20SBram Moolenaar */ 3082f9cc9f20SBram Moolenaar static void 3083f9cc9f20SBram Moolenaar syn_unadd_group(void) 3084f9cc9f20SBram Moolenaar { 3085f9cc9f20SBram Moolenaar --highlight_ga.ga_len; 3086f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[highlight_ga.ga_len].sg_name); 3087f9cc9f20SBram Moolenaar vim_free(HL_TABLE()[highlight_ga.ga_len].sg_name_u); 3088f9cc9f20SBram Moolenaar } 3089f9cc9f20SBram Moolenaar 3090f9cc9f20SBram Moolenaar /* 3091f9cc9f20SBram Moolenaar * Translate a group ID to highlight attributes. 3092f9cc9f20SBram Moolenaar */ 3093f9cc9f20SBram Moolenaar int 3094f9cc9f20SBram Moolenaar syn_id2attr(int hl_id) 3095f9cc9f20SBram Moolenaar { 3096f9cc9f20SBram Moolenaar int attr; 3097f9cc9f20SBram Moolenaar hl_group_T *sgp; 3098f9cc9f20SBram Moolenaar 3099f9cc9f20SBram Moolenaar hl_id = syn_get_final_id(hl_id); 3100f9cc9f20SBram Moolenaar sgp = &HL_TABLE()[hl_id - 1]; // index is ID minus one 3101f9cc9f20SBram Moolenaar 3102f9cc9f20SBram Moolenaar #ifdef FEAT_GUI 3103f9cc9f20SBram Moolenaar /* 3104f9cc9f20SBram Moolenaar * Only use GUI attr when the GUI is being used. 3105f9cc9f20SBram Moolenaar */ 3106f9cc9f20SBram Moolenaar if (gui.in_use) 3107f9cc9f20SBram Moolenaar attr = sgp->sg_gui_attr; 3108f9cc9f20SBram Moolenaar else 3109f9cc9f20SBram Moolenaar #endif 3110f9cc9f20SBram Moolenaar if (IS_CTERM) 3111f9cc9f20SBram Moolenaar attr = sgp->sg_cterm_attr; 3112f9cc9f20SBram Moolenaar else 3113f9cc9f20SBram Moolenaar attr = sgp->sg_term_attr; 3114f9cc9f20SBram Moolenaar 3115f9cc9f20SBram Moolenaar return attr; 3116f9cc9f20SBram Moolenaar } 3117f9cc9f20SBram Moolenaar 3118f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) || defined(PROTO) 3119f9cc9f20SBram Moolenaar /* 3120f9cc9f20SBram Moolenaar * Get the GUI colors and attributes for a group ID. 3121f9cc9f20SBram Moolenaar * NOTE: the colors will be INVALCOLOR when not set, the color otherwise. 3122f9cc9f20SBram Moolenaar */ 3123f9cc9f20SBram Moolenaar int 3124f9cc9f20SBram Moolenaar syn_id2colors(int hl_id, guicolor_T *fgp, guicolor_T *bgp) 3125f9cc9f20SBram Moolenaar { 3126f9cc9f20SBram Moolenaar hl_group_T *sgp; 3127f9cc9f20SBram Moolenaar 3128f9cc9f20SBram Moolenaar hl_id = syn_get_final_id(hl_id); 3129f9cc9f20SBram Moolenaar sgp = &HL_TABLE()[hl_id - 1]; // index is ID minus one 3130f9cc9f20SBram Moolenaar 3131f9cc9f20SBram Moolenaar *fgp = sgp->sg_gui_fg; 3132f9cc9f20SBram Moolenaar *bgp = sgp->sg_gui_bg; 3133f9cc9f20SBram Moolenaar return sgp->sg_gui; 3134f9cc9f20SBram Moolenaar } 3135f9cc9f20SBram Moolenaar #endif 3136f9cc9f20SBram Moolenaar 3137f9cc9f20SBram Moolenaar #if (defined(MSWIN) \ 3138f9cc9f20SBram Moolenaar && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL)) \ 3139f9cc9f20SBram Moolenaar && defined(FEAT_TERMGUICOLORS)) || defined(PROTO) 3140f9cc9f20SBram Moolenaar void 3141f9cc9f20SBram Moolenaar syn_id2cterm_bg(int hl_id, int *fgp, int *bgp) 3142f9cc9f20SBram Moolenaar { 3143f9cc9f20SBram Moolenaar hl_group_T *sgp; 3144f9cc9f20SBram Moolenaar 3145f9cc9f20SBram Moolenaar hl_id = syn_get_final_id(hl_id); 3146f9cc9f20SBram Moolenaar sgp = &HL_TABLE()[hl_id - 1]; // index is ID minus one 3147f9cc9f20SBram Moolenaar *fgp = sgp->sg_cterm_fg - 1; 3148f9cc9f20SBram Moolenaar *bgp = sgp->sg_cterm_bg - 1; 3149f9cc9f20SBram Moolenaar } 3150f9cc9f20SBram Moolenaar #endif 3151f9cc9f20SBram Moolenaar 3152f9cc9f20SBram Moolenaar /* 3153f9cc9f20SBram Moolenaar * Translate a group ID to the final group ID (following links). 3154f9cc9f20SBram Moolenaar */ 3155f9cc9f20SBram Moolenaar int 3156f9cc9f20SBram Moolenaar syn_get_final_id(int hl_id) 3157f9cc9f20SBram Moolenaar { 3158f9cc9f20SBram Moolenaar int count; 3159f9cc9f20SBram Moolenaar hl_group_T *sgp; 3160f9cc9f20SBram Moolenaar 3161f9cc9f20SBram Moolenaar if (hl_id > highlight_ga.ga_len || hl_id < 1) 3162f9cc9f20SBram Moolenaar return 0; // Can be called from eval!! 3163f9cc9f20SBram Moolenaar 3164f9cc9f20SBram Moolenaar /* 3165f9cc9f20SBram Moolenaar * Follow links until there is no more. 3166f9cc9f20SBram Moolenaar * Look out for loops! Break after 100 links. 3167f9cc9f20SBram Moolenaar */ 3168f9cc9f20SBram Moolenaar for (count = 100; --count >= 0; ) 3169f9cc9f20SBram Moolenaar { 3170f9cc9f20SBram Moolenaar sgp = &HL_TABLE()[hl_id - 1]; // index is ID minus one 3171f9cc9f20SBram Moolenaar if (sgp->sg_link == 0 || sgp->sg_link > highlight_ga.ga_len) 3172f9cc9f20SBram Moolenaar break; 3173f9cc9f20SBram Moolenaar hl_id = sgp->sg_link; 3174f9cc9f20SBram Moolenaar } 3175f9cc9f20SBram Moolenaar 3176f9cc9f20SBram Moolenaar return hl_id; 3177f9cc9f20SBram Moolenaar } 3178f9cc9f20SBram Moolenaar 3179f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) || defined(PROTO) 3180f9cc9f20SBram Moolenaar /* 3181f9cc9f20SBram Moolenaar * Call this function just after the GUI has started. 3182f9cc9f20SBram Moolenaar * Also called when 'termguicolors' was set, gui.in_use will be FALSE then. 3183f9cc9f20SBram Moolenaar * It finds the font and color handles for the highlighting groups. 3184f9cc9f20SBram Moolenaar */ 3185f9cc9f20SBram Moolenaar void 3186f9cc9f20SBram Moolenaar highlight_gui_started(void) 3187f9cc9f20SBram Moolenaar { 3188f9cc9f20SBram Moolenaar int idx; 3189f9cc9f20SBram Moolenaar 3190f9cc9f20SBram Moolenaar // First get the colors from the "Normal" and "Menu" group, if set 3191f9cc9f20SBram Moolenaar if (USE_24BIT) 3192f9cc9f20SBram Moolenaar set_normal_colors(); 3193f9cc9f20SBram Moolenaar 3194f9cc9f20SBram Moolenaar for (idx = 0; idx < highlight_ga.ga_len; ++idx) 3195f9cc9f20SBram Moolenaar gui_do_one_color(idx, FALSE, FALSE); 3196f9cc9f20SBram Moolenaar 3197f9cc9f20SBram Moolenaar highlight_changed(); 3198f9cc9f20SBram Moolenaar } 3199f9cc9f20SBram Moolenaar 3200f9cc9f20SBram Moolenaar static void 3201f9cc9f20SBram Moolenaar gui_do_one_color( 3202f9cc9f20SBram Moolenaar int idx, 3203f9cc9f20SBram Moolenaar int do_menu UNUSED, // TRUE: might set the menu font 3204f9cc9f20SBram Moolenaar int do_tooltip UNUSED) // TRUE: might set the tooltip font 3205f9cc9f20SBram Moolenaar { 3206f9cc9f20SBram Moolenaar int didit = FALSE; 3207f9cc9f20SBram Moolenaar 3208f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 3209f9cc9f20SBram Moolenaar # ifdef FEAT_TERMGUICOLORS 3210f9cc9f20SBram Moolenaar if (gui.in_use) 3211f9cc9f20SBram Moolenaar # endif 3212f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_font_name != NULL) 3213f9cc9f20SBram Moolenaar { 3214f9cc9f20SBram Moolenaar hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu, 3215f9cc9f20SBram Moolenaar do_tooltip, TRUE); 3216f9cc9f20SBram Moolenaar didit = TRUE; 3217f9cc9f20SBram Moolenaar } 3218f9cc9f20SBram Moolenaar # endif 3219f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_gui_fg_name != NULL) 3220f9cc9f20SBram Moolenaar { 3221f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_fg = 3222f9cc9f20SBram Moolenaar color_name2handle(HL_TABLE()[idx].sg_gui_fg_name); 3223f9cc9f20SBram Moolenaar didit = TRUE; 3224f9cc9f20SBram Moolenaar } 3225f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_gui_bg_name != NULL) 3226f9cc9f20SBram Moolenaar { 3227f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_bg = 3228f9cc9f20SBram Moolenaar color_name2handle(HL_TABLE()[idx].sg_gui_bg_name); 3229f9cc9f20SBram Moolenaar didit = TRUE; 3230f9cc9f20SBram Moolenaar } 3231f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 3232f9cc9f20SBram Moolenaar if (HL_TABLE()[idx].sg_gui_sp_name != NULL) 3233f9cc9f20SBram Moolenaar { 3234f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_gui_sp = 3235f9cc9f20SBram Moolenaar color_name2handle(HL_TABLE()[idx].sg_gui_sp_name); 3236f9cc9f20SBram Moolenaar didit = TRUE; 3237f9cc9f20SBram Moolenaar } 3238f9cc9f20SBram Moolenaar # endif 3239f9cc9f20SBram Moolenaar if (didit) // need to get a new attr number 3240f9cc9f20SBram Moolenaar set_hl_attr(idx); 3241f9cc9f20SBram Moolenaar } 3242f9cc9f20SBram Moolenaar #endif 3243f9cc9f20SBram Moolenaar 3244f9cc9f20SBram Moolenaar #if defined(USER_HIGHLIGHT) && defined(FEAT_STL_OPT) 3245f9cc9f20SBram Moolenaar /* 3246f9cc9f20SBram Moolenaar * Apply difference between User[1-9] and HLF_S to HLF_SNC, HLF_ST or HLF_STNC. 3247f9cc9f20SBram Moolenaar */ 3248f9cc9f20SBram Moolenaar static void 3249f9cc9f20SBram Moolenaar combine_stl_hlt( 3250f9cc9f20SBram Moolenaar int id, 3251f9cc9f20SBram Moolenaar int id_S, 3252f9cc9f20SBram Moolenaar int id_alt, 3253f9cc9f20SBram Moolenaar int hlcnt, 3254f9cc9f20SBram Moolenaar int i, 3255f9cc9f20SBram Moolenaar int hlf, 3256f9cc9f20SBram Moolenaar int *table) 3257f9cc9f20SBram Moolenaar { 3258f9cc9f20SBram Moolenaar hl_group_T *hlt = HL_TABLE(); 3259f9cc9f20SBram Moolenaar 3260f9cc9f20SBram Moolenaar if (id_alt == 0) 3261f9cc9f20SBram Moolenaar { 3262f9cc9f20SBram Moolenaar vim_memset(&hlt[hlcnt + i], 0, sizeof(hl_group_T)); 3263f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_term = highlight_attr[hlf]; 3264f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_cterm = highlight_attr[hlf]; 3265f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_EVAL) 3266f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_gui = highlight_attr[hlf]; 3267f9cc9f20SBram Moolenaar # endif 3268f9cc9f20SBram Moolenaar } 3269f9cc9f20SBram Moolenaar else 3270f9cc9f20SBram Moolenaar mch_memmove(&hlt[hlcnt + i], 3271f9cc9f20SBram Moolenaar &hlt[id_alt - 1], 3272f9cc9f20SBram Moolenaar sizeof(hl_group_T)); 3273f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_link = 0; 3274f9cc9f20SBram Moolenaar 3275f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_term ^= 3276f9cc9f20SBram Moolenaar hlt[id - 1].sg_term ^ hlt[id_S - 1].sg_term; 3277f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_start != hlt[id_S - 1].sg_start) 3278f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_start = hlt[id - 1].sg_start; 3279f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_stop != hlt[id_S - 1].sg_stop) 3280f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_stop = hlt[id - 1].sg_stop; 3281f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_cterm ^= 3282f9cc9f20SBram Moolenaar hlt[id - 1].sg_cterm ^ hlt[id_S - 1].sg_cterm; 3283f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_cterm_fg != hlt[id_S - 1].sg_cterm_fg) 3284f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_cterm_fg = hlt[id - 1].sg_cterm_fg; 3285f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_cterm_bg != hlt[id_S - 1].sg_cterm_bg) 3286f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_cterm_bg = hlt[id - 1].sg_cterm_bg; 3287f9cc9f20SBram Moolenaar # if defined(FEAT_GUI) || defined(FEAT_EVAL) 3288f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_gui ^= 3289f9cc9f20SBram Moolenaar hlt[id - 1].sg_gui ^ hlt[id_S - 1].sg_gui; 3290f9cc9f20SBram Moolenaar # endif 3291f9cc9f20SBram Moolenaar # ifdef FEAT_GUI 3292f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_gui_fg != hlt[id_S - 1].sg_gui_fg) 3293f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_gui_fg = hlt[id - 1].sg_gui_fg; 3294f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_gui_bg != hlt[id_S - 1].sg_gui_bg) 3295f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_gui_bg = hlt[id - 1].sg_gui_bg; 3296f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_gui_sp != hlt[id_S - 1].sg_gui_sp) 3297f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_gui_sp = hlt[id - 1].sg_gui_sp; 3298f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_font != hlt[id_S - 1].sg_font) 3299f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_font = hlt[id - 1].sg_font; 3300f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 3301f9cc9f20SBram Moolenaar if (hlt[id - 1].sg_fontset != hlt[id_S - 1].sg_fontset) 3302f9cc9f20SBram Moolenaar hlt[hlcnt + i].sg_fontset = hlt[id - 1].sg_fontset; 3303f9cc9f20SBram Moolenaar # endif 3304f9cc9f20SBram Moolenaar # endif 3305f9cc9f20SBram Moolenaar highlight_ga.ga_len = hlcnt + i + 1; 3306f9cc9f20SBram Moolenaar set_hl_attr(hlcnt + i); // At long last we can apply 3307f9cc9f20SBram Moolenaar table[i] = syn_id2attr(hlcnt + i + 1); 3308f9cc9f20SBram Moolenaar } 3309f9cc9f20SBram Moolenaar #endif 3310f9cc9f20SBram Moolenaar 3311f9cc9f20SBram Moolenaar /* 3312f9cc9f20SBram Moolenaar * Translate the 'highlight' option into attributes in highlight_attr[] and 3313f9cc9f20SBram Moolenaar * set up the user highlights User1..9. If FEAT_STL_OPT is in use, a set of 3314f9cc9f20SBram Moolenaar * corresponding highlights to use on top of HLF_SNC is computed. 3315f9cc9f20SBram Moolenaar * Called only when the 'highlight' option has been changed and upon first 3316f9cc9f20SBram Moolenaar * screen redraw after any :highlight command. 3317f9cc9f20SBram Moolenaar * Return FAIL when an invalid flag is found in 'highlight'. OK otherwise. 3318f9cc9f20SBram Moolenaar */ 3319f9cc9f20SBram Moolenaar int 3320f9cc9f20SBram Moolenaar highlight_changed(void) 3321f9cc9f20SBram Moolenaar { 3322f9cc9f20SBram Moolenaar int hlf; 3323f9cc9f20SBram Moolenaar int i; 3324f9cc9f20SBram Moolenaar char_u *p; 3325f9cc9f20SBram Moolenaar int attr; 3326f9cc9f20SBram Moolenaar char_u *end; 3327f9cc9f20SBram Moolenaar int id; 3328f9cc9f20SBram Moolenaar #ifdef USER_HIGHLIGHT 3329f9cc9f20SBram Moolenaar char_u userhl[30]; // use 30 to avoid compiler warning 3330f9cc9f20SBram Moolenaar # ifdef FEAT_STL_OPT 3331f9cc9f20SBram Moolenaar int id_S = -1; 3332f9cc9f20SBram Moolenaar int id_SNC = 0; 3333f9cc9f20SBram Moolenaar # ifdef FEAT_TERMINAL 3334f9cc9f20SBram Moolenaar int id_ST = 0; 3335f9cc9f20SBram Moolenaar int id_STNC = 0; 3336f9cc9f20SBram Moolenaar # endif 3337f9cc9f20SBram Moolenaar int hlcnt; 3338f9cc9f20SBram Moolenaar # endif 3339f9cc9f20SBram Moolenaar #endif 3340f9cc9f20SBram Moolenaar static int hl_flags[HLF_COUNT] = HL_FLAGS; 3341f9cc9f20SBram Moolenaar 3342f9cc9f20SBram Moolenaar need_highlight_changed = FALSE; 3343f9cc9f20SBram Moolenaar 3344f9cc9f20SBram Moolenaar /* 3345f9cc9f20SBram Moolenaar * Clear all attributes. 3346f9cc9f20SBram Moolenaar */ 3347f9cc9f20SBram Moolenaar for (hlf = 0; hlf < (int)HLF_COUNT; ++hlf) 3348f9cc9f20SBram Moolenaar highlight_attr[hlf] = 0; 3349f9cc9f20SBram Moolenaar 3350f9cc9f20SBram Moolenaar /* 3351f9cc9f20SBram Moolenaar * First set all attributes to their default value. 3352f9cc9f20SBram Moolenaar * Then use the attributes from the 'highlight' option. 3353f9cc9f20SBram Moolenaar */ 3354f9cc9f20SBram Moolenaar for (i = 0; i < 2; ++i) 3355f9cc9f20SBram Moolenaar { 3356f9cc9f20SBram Moolenaar if (i) 3357f9cc9f20SBram Moolenaar p = p_hl; 3358f9cc9f20SBram Moolenaar else 3359f9cc9f20SBram Moolenaar p = get_highlight_default(); 3360f9cc9f20SBram Moolenaar if (p == NULL) // just in case 3361f9cc9f20SBram Moolenaar continue; 3362f9cc9f20SBram Moolenaar 3363f9cc9f20SBram Moolenaar while (*p) 3364f9cc9f20SBram Moolenaar { 3365f9cc9f20SBram Moolenaar for (hlf = 0; hlf < (int)HLF_COUNT; ++hlf) 3366f9cc9f20SBram Moolenaar if (hl_flags[hlf] == *p) 3367f9cc9f20SBram Moolenaar break; 3368f9cc9f20SBram Moolenaar ++p; 3369f9cc9f20SBram Moolenaar if (hlf == (int)HLF_COUNT || *p == NUL) 3370f9cc9f20SBram Moolenaar return FAIL; 3371f9cc9f20SBram Moolenaar 3372f9cc9f20SBram Moolenaar /* 3373f9cc9f20SBram Moolenaar * Allow several hl_flags to be combined, like "bu" for 3374f9cc9f20SBram Moolenaar * bold-underlined. 3375f9cc9f20SBram Moolenaar */ 3376f9cc9f20SBram Moolenaar attr = 0; 3377f9cc9f20SBram Moolenaar for ( ; *p && *p != ','; ++p) // parse upto comma 3378f9cc9f20SBram Moolenaar { 3379f9cc9f20SBram Moolenaar if (VIM_ISWHITE(*p)) // ignore white space 3380f9cc9f20SBram Moolenaar continue; 3381f9cc9f20SBram Moolenaar 3382f9cc9f20SBram Moolenaar if (attr > HL_ALL) // Combination with ':' is not allowed. 3383f9cc9f20SBram Moolenaar return FAIL; 3384f9cc9f20SBram Moolenaar 3385f9cc9f20SBram Moolenaar switch (*p) 3386f9cc9f20SBram Moolenaar { 3387f9cc9f20SBram Moolenaar case 'b': attr |= HL_BOLD; 3388f9cc9f20SBram Moolenaar break; 3389f9cc9f20SBram Moolenaar case 'i': attr |= HL_ITALIC; 3390f9cc9f20SBram Moolenaar break; 3391f9cc9f20SBram Moolenaar case '-': 3392f9cc9f20SBram Moolenaar case 'n': // no highlighting 3393f9cc9f20SBram Moolenaar break; 3394f9cc9f20SBram Moolenaar case 'r': attr |= HL_INVERSE; 3395f9cc9f20SBram Moolenaar break; 3396f9cc9f20SBram Moolenaar case 's': attr |= HL_STANDOUT; 3397f9cc9f20SBram Moolenaar break; 3398f9cc9f20SBram Moolenaar case 'u': attr |= HL_UNDERLINE; 3399f9cc9f20SBram Moolenaar break; 3400f9cc9f20SBram Moolenaar case 'c': attr |= HL_UNDERCURL; 3401f9cc9f20SBram Moolenaar break; 3402f9cc9f20SBram Moolenaar case 't': attr |= HL_STRIKETHROUGH; 3403f9cc9f20SBram Moolenaar break; 3404f9cc9f20SBram Moolenaar case ':': ++p; // highlight group name 3405f9cc9f20SBram Moolenaar if (attr || *p == NUL) // no combinations 3406f9cc9f20SBram Moolenaar return FAIL; 3407f9cc9f20SBram Moolenaar end = vim_strchr(p, ','); 3408f9cc9f20SBram Moolenaar if (end == NULL) 3409f9cc9f20SBram Moolenaar end = p + STRLEN(p); 3410f9cc9f20SBram Moolenaar id = syn_check_group(p, (int)(end - p)); 3411f9cc9f20SBram Moolenaar if (id == 0) 3412f9cc9f20SBram Moolenaar return FAIL; 3413f9cc9f20SBram Moolenaar attr = syn_id2attr(id); 3414f9cc9f20SBram Moolenaar p = end - 1; 3415f9cc9f20SBram Moolenaar #if defined(FEAT_STL_OPT) && defined(USER_HIGHLIGHT) 3416f9cc9f20SBram Moolenaar if (hlf == (int)HLF_SNC) 3417f9cc9f20SBram Moolenaar id_SNC = syn_get_final_id(id); 3418f9cc9f20SBram Moolenaar # ifdef FEAT_TERMINAL 3419f9cc9f20SBram Moolenaar else if (hlf == (int)HLF_ST) 3420f9cc9f20SBram Moolenaar id_ST = syn_get_final_id(id); 3421f9cc9f20SBram Moolenaar else if (hlf == (int)HLF_STNC) 3422f9cc9f20SBram Moolenaar id_STNC = syn_get_final_id(id); 3423f9cc9f20SBram Moolenaar # endif 3424f9cc9f20SBram Moolenaar else if (hlf == (int)HLF_S) 3425f9cc9f20SBram Moolenaar id_S = syn_get_final_id(id); 3426f9cc9f20SBram Moolenaar #endif 3427f9cc9f20SBram Moolenaar break; 3428f9cc9f20SBram Moolenaar default: return FAIL; 3429f9cc9f20SBram Moolenaar } 3430f9cc9f20SBram Moolenaar } 3431f9cc9f20SBram Moolenaar highlight_attr[hlf] = attr; 3432f9cc9f20SBram Moolenaar 3433f9cc9f20SBram Moolenaar p = skip_to_option_part(p); // skip comma and spaces 3434f9cc9f20SBram Moolenaar } 3435f9cc9f20SBram Moolenaar } 3436f9cc9f20SBram Moolenaar 3437f9cc9f20SBram Moolenaar #ifdef USER_HIGHLIGHT 3438f9cc9f20SBram Moolenaar /* 3439f9cc9f20SBram Moolenaar * Setup the user highlights 3440f9cc9f20SBram Moolenaar * 3441f9cc9f20SBram Moolenaar * Temporarily utilize 28 more hl entries: 3442f9cc9f20SBram Moolenaar * 9 for User1-User9 combined with StatusLineNC 3443f9cc9f20SBram Moolenaar * 9 for User1-User9 combined with StatusLineTerm 3444f9cc9f20SBram Moolenaar * 9 for User1-User9 combined with StatusLineTermNC 3445f9cc9f20SBram Moolenaar * 1 for StatusLine default 3446f9cc9f20SBram Moolenaar * Have to be in there simultaneously in case of table overflows in 3447f9cc9f20SBram Moolenaar * get_attr_entry() 3448f9cc9f20SBram Moolenaar */ 3449f9cc9f20SBram Moolenaar # ifdef FEAT_STL_OPT 3450f9cc9f20SBram Moolenaar if (ga_grow(&highlight_ga, 28) == FAIL) 3451f9cc9f20SBram Moolenaar return FAIL; 3452f9cc9f20SBram Moolenaar hlcnt = highlight_ga.ga_len; 3453f9cc9f20SBram Moolenaar if (id_S == -1) 3454f9cc9f20SBram Moolenaar { 3455f9cc9f20SBram Moolenaar // Make sure id_S is always valid to simplify code below. Use the last 3456f9cc9f20SBram Moolenaar // entry. 3457f9cc9f20SBram Moolenaar vim_memset(&HL_TABLE()[hlcnt + 27], 0, sizeof(hl_group_T)); 3458f9cc9f20SBram Moolenaar HL_TABLE()[hlcnt + 18].sg_term = highlight_attr[HLF_S]; 3459f9cc9f20SBram Moolenaar id_S = hlcnt + 19; 3460f9cc9f20SBram Moolenaar } 3461f9cc9f20SBram Moolenaar # endif 3462f9cc9f20SBram Moolenaar for (i = 0; i < 9; i++) 3463f9cc9f20SBram Moolenaar { 3464f9cc9f20SBram Moolenaar sprintf((char *)userhl, "User%d", i + 1); 3465f9cc9f20SBram Moolenaar id = syn_name2id(userhl); 3466f9cc9f20SBram Moolenaar if (id == 0) 3467f9cc9f20SBram Moolenaar { 3468f9cc9f20SBram Moolenaar highlight_user[i] = 0; 3469f9cc9f20SBram Moolenaar # ifdef FEAT_STL_OPT 3470f9cc9f20SBram Moolenaar highlight_stlnc[i] = 0; 3471f9cc9f20SBram Moolenaar # ifdef FEAT_TERMINAL 3472f9cc9f20SBram Moolenaar highlight_stlterm[i] = 0; 3473f9cc9f20SBram Moolenaar highlight_stltermnc[i] = 0; 3474f9cc9f20SBram Moolenaar # endif 3475f9cc9f20SBram Moolenaar # endif 3476f9cc9f20SBram Moolenaar } 3477f9cc9f20SBram Moolenaar else 3478f9cc9f20SBram Moolenaar { 3479f9cc9f20SBram Moolenaar highlight_user[i] = syn_id2attr(id); 3480f9cc9f20SBram Moolenaar # ifdef FEAT_STL_OPT 3481f9cc9f20SBram Moolenaar combine_stl_hlt(id, id_S, id_SNC, hlcnt, i, 3482f9cc9f20SBram Moolenaar HLF_SNC, highlight_stlnc); 3483f9cc9f20SBram Moolenaar # ifdef FEAT_TERMINAL 3484f9cc9f20SBram Moolenaar combine_stl_hlt(id, id_S, id_ST, hlcnt + 9, i, 3485f9cc9f20SBram Moolenaar HLF_ST, highlight_stlterm); 3486f9cc9f20SBram Moolenaar combine_stl_hlt(id, id_S, id_STNC, hlcnt + 18, i, 3487f9cc9f20SBram Moolenaar HLF_STNC, highlight_stltermnc); 3488f9cc9f20SBram Moolenaar # endif 3489f9cc9f20SBram Moolenaar # endif 3490f9cc9f20SBram Moolenaar } 3491f9cc9f20SBram Moolenaar } 3492f9cc9f20SBram Moolenaar # ifdef FEAT_STL_OPT 3493f9cc9f20SBram Moolenaar highlight_ga.ga_len = hlcnt; 3494f9cc9f20SBram Moolenaar # endif 3495f9cc9f20SBram Moolenaar 3496f9cc9f20SBram Moolenaar #endif // USER_HIGHLIGHT 3497f9cc9f20SBram Moolenaar 3498f9cc9f20SBram Moolenaar return OK; 3499f9cc9f20SBram Moolenaar } 3500f9cc9f20SBram Moolenaar 3501f9cc9f20SBram Moolenaar #if defined(FEAT_CMDL_COMPL) || defined(PROTO) 3502f9cc9f20SBram Moolenaar 3503f9cc9f20SBram Moolenaar static void highlight_list(void); 3504f9cc9f20SBram Moolenaar static void highlight_list_two(int cnt, int attr); 3505f9cc9f20SBram Moolenaar 3506f9cc9f20SBram Moolenaar /* 3507f9cc9f20SBram Moolenaar * Handle command line completion for :highlight command. 3508f9cc9f20SBram Moolenaar */ 3509f9cc9f20SBram Moolenaar void 3510f9cc9f20SBram Moolenaar set_context_in_highlight_cmd(expand_T *xp, char_u *arg) 3511f9cc9f20SBram Moolenaar { 3512f9cc9f20SBram Moolenaar char_u *p; 3513f9cc9f20SBram Moolenaar 3514f9cc9f20SBram Moolenaar // Default: expand group names 3515f9cc9f20SBram Moolenaar xp->xp_context = EXPAND_HIGHLIGHT; 3516f9cc9f20SBram Moolenaar xp->xp_pattern = arg; 3517f9cc9f20SBram Moolenaar include_link = 2; 3518f9cc9f20SBram Moolenaar include_default = 1; 3519f9cc9f20SBram Moolenaar 3520f9cc9f20SBram Moolenaar // (part of) subcommand already typed 3521f9cc9f20SBram Moolenaar if (*arg != NUL) 3522f9cc9f20SBram Moolenaar { 3523f9cc9f20SBram Moolenaar p = skiptowhite(arg); 3524f9cc9f20SBram Moolenaar if (*p != NUL) // past "default" or group name 3525f9cc9f20SBram Moolenaar { 3526f9cc9f20SBram Moolenaar include_default = 0; 3527f9cc9f20SBram Moolenaar if (STRNCMP("default", arg, p - arg) == 0) 3528f9cc9f20SBram Moolenaar { 3529f9cc9f20SBram Moolenaar arg = skipwhite(p); 3530f9cc9f20SBram Moolenaar xp->xp_pattern = arg; 3531f9cc9f20SBram Moolenaar p = skiptowhite(arg); 3532f9cc9f20SBram Moolenaar } 3533f9cc9f20SBram Moolenaar if (*p != NUL) // past group name 3534f9cc9f20SBram Moolenaar { 3535f9cc9f20SBram Moolenaar include_link = 0; 3536f9cc9f20SBram Moolenaar if (arg[1] == 'i' && arg[0] == 'N') 3537f9cc9f20SBram Moolenaar highlight_list(); 3538f9cc9f20SBram Moolenaar if (STRNCMP("link", arg, p - arg) == 0 3539f9cc9f20SBram Moolenaar || STRNCMP("clear", arg, p - arg) == 0) 3540f9cc9f20SBram Moolenaar { 3541f9cc9f20SBram Moolenaar xp->xp_pattern = skipwhite(p); 3542f9cc9f20SBram Moolenaar p = skiptowhite(xp->xp_pattern); 3543f9cc9f20SBram Moolenaar if (*p != NUL) // past first group name 3544f9cc9f20SBram Moolenaar { 3545f9cc9f20SBram Moolenaar xp->xp_pattern = skipwhite(p); 3546f9cc9f20SBram Moolenaar p = skiptowhite(xp->xp_pattern); 3547f9cc9f20SBram Moolenaar } 3548f9cc9f20SBram Moolenaar } 3549f9cc9f20SBram Moolenaar if (*p != NUL) // past group name(s) 3550f9cc9f20SBram Moolenaar xp->xp_context = EXPAND_NOTHING; 3551f9cc9f20SBram Moolenaar } 3552f9cc9f20SBram Moolenaar } 3553f9cc9f20SBram Moolenaar } 3554f9cc9f20SBram Moolenaar } 3555f9cc9f20SBram Moolenaar 3556f9cc9f20SBram Moolenaar /* 3557f9cc9f20SBram Moolenaar * List highlighting matches in a nice way. 3558f9cc9f20SBram Moolenaar */ 3559f9cc9f20SBram Moolenaar static void 3560f9cc9f20SBram Moolenaar highlight_list(void) 3561f9cc9f20SBram Moolenaar { 3562f9cc9f20SBram Moolenaar int i; 3563f9cc9f20SBram Moolenaar 3564f9cc9f20SBram Moolenaar for (i = 10; --i >= 0; ) 3565f9cc9f20SBram Moolenaar highlight_list_two(i, HL_ATTR(HLF_D)); 3566f9cc9f20SBram Moolenaar for (i = 40; --i >= 0; ) 3567f9cc9f20SBram Moolenaar highlight_list_two(99, 0); 3568f9cc9f20SBram Moolenaar } 3569f9cc9f20SBram Moolenaar 3570f9cc9f20SBram Moolenaar static void 3571f9cc9f20SBram Moolenaar highlight_list_two(int cnt, int attr) 3572f9cc9f20SBram Moolenaar { 3573f9cc9f20SBram Moolenaar msg_puts_attr(&("N \bI \b! \b"[cnt / 11]), attr); 3574f9cc9f20SBram Moolenaar msg_clr_eos(); 3575f9cc9f20SBram Moolenaar out_flush(); 3576f9cc9f20SBram Moolenaar ui_delay(cnt == 99 ? 40L : (long)cnt * 50L, FALSE); 3577f9cc9f20SBram Moolenaar } 3578f9cc9f20SBram Moolenaar 3579f9cc9f20SBram Moolenaar #endif // FEAT_CMDL_COMPL 3580f9cc9f20SBram Moolenaar 3581f9cc9f20SBram Moolenaar #if defined(FEAT_CMDL_COMPL) || (defined(FEAT_SYN_HL) && defined(FEAT_EVAL)) \ 3582f9cc9f20SBram Moolenaar || defined(FEAT_SIGNS) || defined(PROTO) 3583f9cc9f20SBram Moolenaar /* 3584f9cc9f20SBram Moolenaar * Function given to ExpandGeneric() to obtain the list of group names. 3585f9cc9f20SBram Moolenaar */ 3586f9cc9f20SBram Moolenaar char_u * 3587f9cc9f20SBram Moolenaar get_highlight_name(expand_T *xp UNUSED, int idx) 3588f9cc9f20SBram Moolenaar { 3589f9cc9f20SBram Moolenaar return get_highlight_name_ext(xp, idx, TRUE); 3590f9cc9f20SBram Moolenaar } 3591f9cc9f20SBram Moolenaar 3592f9cc9f20SBram Moolenaar /* 3593f9cc9f20SBram Moolenaar * Obtain a highlight group name. 3594f9cc9f20SBram Moolenaar * When "skip_cleared" is TRUE don't return a cleared entry. 3595f9cc9f20SBram Moolenaar */ 3596f9cc9f20SBram Moolenaar char_u * 3597f9cc9f20SBram Moolenaar get_highlight_name_ext(expand_T *xp UNUSED, int idx, int skip_cleared) 3598f9cc9f20SBram Moolenaar { 3599f9cc9f20SBram Moolenaar if (idx < 0) 3600f9cc9f20SBram Moolenaar return NULL; 3601f9cc9f20SBram Moolenaar 3602f9cc9f20SBram Moolenaar // Items are never removed from the table, skip the ones that were 3603f9cc9f20SBram Moolenaar // cleared. 3604f9cc9f20SBram Moolenaar if (skip_cleared && idx < highlight_ga.ga_len && HL_TABLE()[idx].sg_cleared) 3605f9cc9f20SBram Moolenaar return (char_u *)""; 3606f9cc9f20SBram Moolenaar 3607f9cc9f20SBram Moolenaar #ifdef FEAT_CMDL_COMPL 3608f9cc9f20SBram Moolenaar if (idx == highlight_ga.ga_len && include_none != 0) 3609f9cc9f20SBram Moolenaar return (char_u *)"none"; 3610f9cc9f20SBram Moolenaar if (idx == highlight_ga.ga_len + include_none && include_default != 0) 3611f9cc9f20SBram Moolenaar return (char_u *)"default"; 3612f9cc9f20SBram Moolenaar if (idx == highlight_ga.ga_len + include_none + include_default 3613f9cc9f20SBram Moolenaar && include_link != 0) 3614f9cc9f20SBram Moolenaar return (char_u *)"link"; 3615f9cc9f20SBram Moolenaar if (idx == highlight_ga.ga_len + include_none + include_default + 1 3616f9cc9f20SBram Moolenaar && include_link != 0) 3617f9cc9f20SBram Moolenaar return (char_u *)"clear"; 3618f9cc9f20SBram Moolenaar #endif 3619f9cc9f20SBram Moolenaar if (idx >= highlight_ga.ga_len) 3620f9cc9f20SBram Moolenaar return NULL; 3621f9cc9f20SBram Moolenaar return HL_TABLE()[idx].sg_name; 3622f9cc9f20SBram Moolenaar } 3623f9cc9f20SBram Moolenaar #endif 3624f9cc9f20SBram Moolenaar 3625f9cc9f20SBram Moolenaar #if defined(FEAT_GUI) || defined(PROTO) 3626f9cc9f20SBram Moolenaar /* 3627f9cc9f20SBram Moolenaar * Free all the highlight group fonts. 3628f9cc9f20SBram Moolenaar * Used when quitting for systems which need it. 3629f9cc9f20SBram Moolenaar */ 3630f9cc9f20SBram Moolenaar void 3631f9cc9f20SBram Moolenaar free_highlight_fonts(void) 3632f9cc9f20SBram Moolenaar { 3633f9cc9f20SBram Moolenaar int idx; 3634f9cc9f20SBram Moolenaar 3635f9cc9f20SBram Moolenaar for (idx = 0; idx < highlight_ga.ga_len; ++idx) 3636f9cc9f20SBram Moolenaar { 3637f9cc9f20SBram Moolenaar gui_mch_free_font(HL_TABLE()[idx].sg_font); 3638f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_font = NOFONT; 3639f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 3640f9cc9f20SBram Moolenaar gui_mch_free_fontset(HL_TABLE()[idx].sg_fontset); 3641f9cc9f20SBram Moolenaar HL_TABLE()[idx].sg_fontset = NOFONTSET; 3642f9cc9f20SBram Moolenaar # endif 3643f9cc9f20SBram Moolenaar } 3644f9cc9f20SBram Moolenaar 3645f9cc9f20SBram Moolenaar gui_mch_free_font(gui.norm_font); 3646f9cc9f20SBram Moolenaar # ifdef FEAT_XFONTSET 3647f9cc9f20SBram Moolenaar gui_mch_free_fontset(gui.fontset); 3648f9cc9f20SBram Moolenaar # endif 3649f9cc9f20SBram Moolenaar # ifndef FEAT_GUI_GTK 3650f9cc9f20SBram Moolenaar gui_mch_free_font(gui.bold_font); 3651f9cc9f20SBram Moolenaar gui_mch_free_font(gui.ital_font); 3652f9cc9f20SBram Moolenaar gui_mch_free_font(gui.boldital_font); 3653f9cc9f20SBram Moolenaar # endif 3654f9cc9f20SBram Moolenaar } 3655f9cc9f20SBram Moolenaar #endif 3656