1 #ifndef NVIM_HIGHLIGHT_DEFS_H
2 #define NVIM_HIGHLIGHT_DEFS_H
3 
4 #include <inttypes.h>
5 
6 #include "nvim/macros.h"
7 #include "nvim/types.h"
8 
9 typedef int32_t RgbValue;
10 
11 /// Highlighting attribute bits.
12 ///
13 /// sign bit should not be used here, as it identifies invalid highlight
14 typedef enum {
15   HL_INVERSE         = 0x01,
16   HL_BOLD            = 0x02,
17   HL_ITALIC          = 0x04,
18   HL_UNDERLINE       = 0x08,
19   HL_UNDERCURL       = 0x10,
20   HL_STANDOUT        = 0x20,
21   HL_STRIKETHROUGH   = 0x40,
22   HL_NOCOMBINE       = 0x80,
23   HL_BG_INDEXED    = 0x0100,
24   HL_FG_INDEXED    = 0x0200,
25   HL_DEFAULT       = 0x0400,
26   HL_GLOBAL        = 0x0800,
27 } HlAttrFlags;
28 
29 /// Stores a complete highlighting entry, including colors and attributes
30 /// for both TUI and GUI.
31 typedef struct attr_entry {
32   int16_t rgb_ae_attr, cterm_ae_attr;  ///< HlAttrFlags
33   RgbValue rgb_fg_color, rgb_bg_color, rgb_sp_color;
34   int cterm_fg_color, cterm_bg_color;
35   int hl_blend;
36 } HlAttrs;
37 
38 #define HLATTRS_INIT (HlAttrs) { \
39   .rgb_ae_attr = 0, \
40   .cterm_ae_attr = 0, \
41   .rgb_fg_color = -1, \
42   .rgb_bg_color = -1, \
43   .rgb_sp_color = -1, \
44   .cterm_fg_color = 0, \
45   .cterm_bg_color = 0, \
46   .hl_blend = -1, \
47 }
48 
49 /// Values for index in highlight_attr[].
50 /// When making changes, also update hlf_names below!
51 typedef enum {
52   HLF_8 = 0,        // Meta & special keys listed with ":map", text that is
53                     // displayed different from what it is
54   HLF_EOB,        // after the last line in the buffer
55   HLF_TERM,       // terminal cursor focused
56   HLF_TERMNC,     // terminal cursor unfocused
57   HLF_AT,          // @ characters at end of screen, characters that don't really exist in the text
58   HLF_D,          // directories in CTRL-D listing
59   HLF_E,          // error messages
60   HLF_I,          // incremental search
61   HLF_L,          // last search string
62   HLF_M,          // "--More--" message
63   HLF_CM,         // Mode (e.g., "-- INSERT --")
64   HLF_N,          // line number for ":number" and ":#" commands
65   HLF_LNA,        // LineNrAbove
66   HLF_LNB,        // LineNrBelow
67   HLF_CLN,        // current line number when 'cursorline' is set
68   HLF_R,          // return to continue message and yes/no questions
69   HLF_S,          // status lines
70   HLF_SNC,        // status lines of not-current windows
71   HLF_C,          // column to separate vertically split windows
72   HLF_T,          // Titles for output from ":set all", ":autocmd" etc.
73   HLF_V,          // Visual mode
74   HLF_VNC,        // Visual mode, autoselecting and not clipboard owner
75   HLF_W,          // warning messages
76   HLF_WM,         // Wildmenu highlight
77   HLF_FL,         // Folded line
78   HLF_FC,         // Fold column
79   HLF_ADD,        // Added diff line
80   HLF_CHD,        // Changed diff line
81   HLF_DED,        // Deleted diff line
82   HLF_TXD,        // Text Changed in diff line
83   HLF_SC,         // Sign column
84   HLF_CONCEAL,    // Concealed text
85   HLF_SPB,        // SpellBad
86   HLF_SPC,        // SpellCap
87   HLF_SPR,        // SpellRare
88   HLF_SPL,        // SpellLocal
89   HLF_PNI,        // popup menu normal item
90   HLF_PSI,        // popup menu selected item
91   HLF_PSB,        // popup menu scrollbar
92   HLF_PST,        // popup menu scrollbar thumb
93   HLF_TP,         // tabpage line
94   HLF_TPS,        // tabpage line selected
95   HLF_TPF,        // tabpage line filler
96   HLF_CUC,        // 'cursorcolumn'
97   HLF_CUL,        // 'cursorline'
98   HLF_MC,         // 'colorcolumn'
99   HLF_QFL,        // selected quickfix line
100   HLF_0,          // Whitespace
101   HLF_INACTIVE,   // NormalNC: Normal text in non-current windows
102   HLF_MSGSEP,     // message separator line
103   HLF_NFLOAT,     // Floating window
104   HLF_MSG,        // Message area
105   HLF_BORDER,     // Floating window border
106   HLF_COUNT,  // MUST be the last one
107 } hlf_T;
108 
109 EXTERN const char *hlf_names[] INIT(= {
110   [HLF_8] = "SpecialKey",
111   [HLF_EOB] = "EndOfBuffer",
112   [HLF_TERM] = "TermCursor",
113   [HLF_TERMNC] = "TermCursorNC",
114   [HLF_AT] = "NonText",
115   [HLF_D] = "Directory",
116   [HLF_E] = "ErrorMsg",
117   [HLF_I] = "IncSearch",
118   [HLF_L] = "Search",
119   [HLF_M] = "MoreMsg",
120   [HLF_CM] = "ModeMsg",
121   [HLF_N] = "LineNr",
122   [HLF_LNA] = "LineNrAbove",
123   [HLF_LNB] = "LineNrBelow",
124   [HLF_CLN] = "CursorLineNr",
125   [HLF_R] = "Question",
126   [HLF_S] = "StatusLine",
127   [HLF_SNC] = "StatusLineNC",
128   [HLF_C] = "VertSplit",
129   [HLF_T] = "Title",
130   [HLF_V] = "Visual",
131   [HLF_VNC] = "VisualNC",
132   [HLF_W] = "WarningMsg",
133   [HLF_WM] = "WildMenu",
134   [HLF_FL] = "Folded",
135   [HLF_FC] = "FoldColumn",
136   [HLF_ADD] = "DiffAdd",
137   [HLF_CHD] = "DiffChange",
138   [HLF_DED] = "DiffDelete",
139   [HLF_TXD] = "DiffText",
140   [HLF_SC] = "SignColumn",
141   [HLF_CONCEAL] = "Conceal",
142   [HLF_SPB] = "SpellBad",
143   [HLF_SPC] = "SpellCap",
144   [HLF_SPR] = "SpellRare",
145   [HLF_SPL] = "SpellLocal",
146   [HLF_PNI] = "Pmenu",
147   [HLF_PSI] = "PmenuSel",
148   [HLF_PSB] = "PmenuSbar",
149   [HLF_PST] = "PmenuThumb",
150   [HLF_TP] = "TabLine",
151   [HLF_TPS] = "TabLineSel",
152   [HLF_TPF] = "TabLineFill",
153   [HLF_CUC] = "CursorColumn",
154   [HLF_CUL] = "CursorLine",
155   [HLF_MC] = "ColorColumn",
156   [HLF_QFL] = "QuickFixLine",
157   [HLF_0] = "Whitespace",
158   [HLF_INACTIVE] = "NormalNC",
159   [HLF_MSGSEP] = "MsgSeparator",
160   [HLF_NFLOAT] = "NormalFloat",
161   [HLF_MSG] = "MsgArea",
162   [HLF_BORDER] = "FloatBorder",
163 });
164 
165 
166 EXTERN int highlight_attr[HLF_COUNT];       // Highl. attr for each context.
167 EXTERN int highlight_attr_last[HLF_COUNT];  // copy for detecting changed groups
168 EXTERN int highlight_user[9];                   // User[1-9] attributes
169 EXTERN int highlight_stlnc[9];                  // On top of user
170 EXTERN int cterm_normal_fg_color INIT(= 0);
171 EXTERN int cterm_normal_bg_color INIT(= 0);
172 EXTERN RgbValue normal_fg INIT(= -1);
173 EXTERN RgbValue normal_bg INIT(= -1);
174 EXTERN RgbValue normal_sp INIT(= -1);
175 
176 typedef enum {
177   kHlUnknown,
178   kHlUI,
179   kHlSyntax,
180   kHlTerminal,
181   kHlCombine,
182   kHlBlend,
183   kHlBlendThrough,
184 } HlKind;
185 
186 typedef struct {
187   HlAttrs attr;
188   HlKind kind;
189   int id1;
190   int id2;
191   int winid;
192 } HlEntry;
193 
194 typedef struct {
195   int ns_id;
196   int syn_id;
197 } ColorKey;
198 #define ColorKey(n, s) (ColorKey) { .ns_id = (int)(n), .syn_id = (s) }
199 
200 typedef struct {
201   int attr_id;
202   int link_id;
203   int version;
204   bool is_default;
205 } ColorItem;
206 #define COLOR_ITEM_INITIALIZER { .attr_id = -1, .link_id = -1, \
207                                  .version = -1, .is_default = false }
208 
209 
210 #endif  // NVIM_HIGHLIGHT_DEFS_H
211