Syntax highlighting
The last feature to implement is syntax highlighting.
New fields
Add a new field in the Buffer type:
Buffer.zig
// Pointer to the syntax definition
syndef: ?*const t.Syntax,
And one in the Row type:
Row.zig
/// True when the row has a multiline comment continuing into next line
ml_comment: bool,
This one becomes true when a line contains the leader that opens the multi-line comment, and stays true in all following rows, until the end of the block is found, in that row it becomes false again.
Initialize both in their relative init(), to null and false respectively.
Add imports where necessary.
Fill the rest of Highlight enum
This is the full Highlight enum, with all needed highlight names:
types.zig
/// All available highlight types.
pub const Highlight = enum(u8) {
/// The normal highlight
normal = 0,
/// Line comments highlight
comment,
/// Multiline comments highlight
mlcomment,
/// Numbers highlight
number,
/// String highlight
string,
/// Highlight for keywords of type 'keyword'
keyword,
/// Highlight for keywords of type 'types'
types,
/// Highlight for keywords of type 'builtin'
builtin,
/// Highlight for keywords of type 'constant'
constant,
/// Highlight for keywords of type 'preproc'
preproc,
/// Highlight for uppercase words
uppercase,
/// Highlight for escape sequences in strings
escape,
/// Incremental search highlight
incsearch,
/// Highlight for non-printable characters
nonprint,
/// Highlight for error messages
err,
};
Fill the rest of hlGroups array
This the full initializer of the hlGroups array, replace the previous one
with it.
hlgroups.zig
/// Array with highlight groups.
pub const hlGroups: [n_hl]t.HlGroup = arr: {
// Initialize the hlGroups array at compile time. A []HlGroup array is
// first declared undefined, then it is filled with all highlight groups.
var hlg: [n_hl]t.HlGroup = undefined;
hlg[int(.normal)] = .{
.fg = FgColor.default,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.comment)] = .{
.fg = FgColor.black_bright,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.mlcomment)] = .{
.fg = FgColor.blue_bright,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.number)] = .{
.fg = FgColor.white_bright,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.string)] = .{
.fg = FgColor.green,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.keyword)] = .{
.fg = FgColor.cyan,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.types)] = .{
.fg = FgColor.cyan_bright,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.builtin)] = .{
.fg = FgColor.magenta,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.constant)] = .{
.fg = FgColor.yellow,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.preproc)] = .{
.fg = FgColor.red_bright,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.uppercase)] = .{
.fg = FgColor.yellow_bright,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.escape)] = .{
.fg = FgColor.red,
.bg = BgColor.default,
.reverse = false,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.incsearch)] = .{
.fg = FgColor.green,
.bg = BgColor.default,
.reverse = true,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.nonprint)] = .{
.fg = FgColor.white,
.bg = BgColor.default,
.reverse = true,
.bold = false,
.italic = false,
.underline = false,
};
hlg[int(.err)] = .{
.fg = FgColor.red_bright,
.bg = BgColor.default,
.reverse = false,
.bold = true,
.italic = false,
.underline = false,
};
break :arr hlg;
};