Skip to content

Highlight Groups

alsi-lawr edited this page Jul 11, 2026 · 1 revision

Highlight groups

Neotheme defines a small set of owned semantic groups, then maps Vim, Tree-sitter, LSP, diagnostics, terminal colors, and integrations onto the resolved palette.

Neotheme-owned groups

Text and surfaces

Group Palette role Attributes
NeothemeText text.primary foreground None
NeothemeTextBright text.bright foreground None
NeothemeTextStrong text.strong foreground Controlled by bold
NeothemeTextMuted text.muted foreground None
NeothemeSurfaceDark surface.dark background None
NeothemeSurface surface.base background None
NeothemeSurfaceRaised surface.raised background None
NeothemeSurfaceSelected surface.selected background None
NeothemeBorder surface.border foreground None

Syntax

Group Palette role Attributes
NeothemeComment syntax.comment Controlled by italic.comments
NeothemeString syntax.string Controlled by italic.strings
NeothemeKeyword syntax.keyword Controlled by bold
NeothemeFunction syntax.function_name None
NeothemeNumber syntax.literal None
NeothemeType syntax.type None
NeothemeProperty syntax.property None
NeothemeOperator syntax.operator Controlled by italic.operators
NeothemePunctuation syntax.punctuation None

Diagnostics and version control

Group Palette role Attributes
NeothemeError diagnostic.error Controlled by bold
NeothemeWarning diagnostic.warning Controlled by bold
NeothemeInformation diagnostic.information Controlled by bold
NeothemeHint diagnostic.hint None
NeothemeSuccess diagnostic.success Controlled by bold
NeothemeAdded version_control.added None
NeothemeChanged version_control.changed None
NeothemeRemoved version_control.removed None

Sidebar groups

Group Definition
NeothemeSidebar text.primary on surface.dark
NeothemeSidebarSign surface.muted on surface.dark

Help and quickfix windows receive these groups through a window-local winhighlight mapping.

Core editor coverage

Core highlights cover:

  • Standard Vim syntax groups
  • Editor, inactive window, cursor line, and color column
  • Search, current search, substitute, matching, and focus states
  • Diff, added, changed, removed, and conflict states
  • Line numbers, signs, folds, and separators
  • Floats, shadows, titles, borders, and footers
  • Popup menu, completion match, hints, and scrollbar states
  • Messages, prompts, questions, errors, and warnings
  • Quickfix, statusline, tabline, visual, whitespace, and spelling groups

Many standard groups link to a Neotheme-owned group; others combine foreground, background, and attributes from multiple semantic roles.

Tree-sitter coverage

Tree-sitter mappings include:

  • Variables, parameters, members, constants, modules, labels, and attributes
  • Strings, documentation strings, escapes, regular expressions, booleans, and numbers
  • Functions, methods, constructors, operators, and types
  • Keywords, directives, punctuation, comments, and comment diagnostics
  • Markup headings, emphasis, quotes, math, links, raw content, and lists
  • Diff captures and markup tags

LSP and diagnostic coverage

Neotheme maps standard LSP semantic token types to matching Tree-sitter captures. It also defines:

  • Reference text, read, write, and target states
  • Inlay hints, code lenses, and active signature parameters
  • Deprecated and unnecessary diagnostics
  • Common semantic modifiers such as readonly, static, declaration, and default library
  • Readonly and default-library type modifier specializations

For each diagnostic severity (Error, Warn, Info, Hint, and Ok), Neotheme defines base, virtual text, virtual lines, underline, floating, and sign groups.

Terminal colors

Neotheme sets every ANSI terminal slot from semantic roles:

Index Semantic role
0 surface.base
1 version_control.conflict
2 diagnostic.success
3 diagnostic.warning
4 syntax.property
5 diagnostic.hint
6 text.muted
7 text.primary
8 surface.base
9 diagnostic.error
10 diagnostic.success
11 diagnostic.warning
12 diagnostic.information
13 diagnostic.hint
14 text.muted
15 text.on_error

terminal_color_background uses surface.base; terminal_color_foreground uses text.primary.

Inspect active highlights

Use Neovim's built-in commands:

:highlight NeothemeKeyword
:highlight Normal
:highlight @function

From Lua:

print(vim.inspect(vim.api.nvim_get_hl(0, { name = "NeothemeKeyword", link = false })))

See Palette Customization to change the roles these groups consume.

Clone this wiki locally