Eva-Theme.nvim

February 9, 2026 · View on GitHub

A semantic coloring code colorscheme for NeoVim ported from Eva-Theme

Supports both Dark and Light modes, with four styles available for each mode: Normal, Bold, Italic, and Italic Bold.

🌙 Dark

Snipaste_2024-08-14_20-20-16

☀ Light

Snipaste_2024-08-14_17-42-18

🎨 Palette

darklightsemantic
\color{#56B7C3}{● \\#56B7C3}\color{#00BEC4}{● \\#00BEC4}type names, arithmetic operators
\color{#98C379}{● \\#98C379}\color{#53A053}{● \\#53A053}string context
\color{#E4BF7F}{● \\#E4BF7F}\color{#F0AA0B}{● \\#F0AA0B}parameter name and typeparameter
\color{#FF9070}{● \\#FF9070}\color{#FF6D12}{● \\#FF6D12}numbers, constants
\color{#E06C75}{● \\#E06C75}\color{#CD6069}{● \\#CD6069}object members/properties, namespaces/modules
\color{#F02B77}{● \\#F02B77}\color{#FA278E}{● \\#FA278E}builtin variables like self, super, this, base
\color{#CF68E1}{● \\#CF68E1}\color{#C838C6}{● \\#C838C6}flow control keywords, boolean literal, null literal,keyword operators
\color{#A78CFA}{● \\#A78CFA}\color{#7C4DFF}{● \\#7C4DFF}declaration keywords
\color{#6495EE}{● \\#6495EE}\color{#437AED}{● \\#437AED}function-like names
\color{#B0B7C3}{● \\#B0B7C3}\color{#5D5D5F}{● \\#5D5D5F}variable
\color{#676E95}{● \\#676E95}\color{#A9A9AA}{● \\#A9A9AA}comment
\color{#FF6AB3}{● \\#FF6AB3}\color{#EF8ED8}{● \\#EF8ED8}primitive/builtin type names

🛠 Installation

Note

For implementation downside, Eva-Theme.nvim uses file cache compilation to improve loading speed. Use :EvaCompile command to compile new cache if necessary.

Lazy

{
  'sharpchen/Eva-Theme.nvim',
  lazy = false,
  priority = 1000,
  build = ':EvaCompile'
}

🎯 Usage

VimScript

colo Eva-Dark " or any other variant
" colo Eva-Light
" colo Eva-Dark-Bold
" colo Eva-Light-Bold
" colo Eva-Dark-Italic
" colo Eva-Light-Italic
" colo Eva-Dark-Italic-Bold
" colo Eva-Light-Italic-Bold

Lua

vim.cmd.colo 'Eva-Dark' -- or any variant

⚙ Options

Override palette

Specify colors for dark and light variants, specified values will be taken while the rest remains default.

Tip

For palette structure, see: palette.lua Or use lazydev.nvim to get completions from type annotations.

require('Eva-Theme').setup({
  override_palette = {
    dark = {
      background = '#14161B',
      -- ...
    },
    light = {
      declarative = '#RRGGBB'
      -- ...
    }
  }
})

Override highlight

To customize any highlight group for each variants, you can use function callbacks [string]: fun(variant: Eva-Theme.ThemeName, palette: Eva-Theme.Palette): vim.keyset.highlight

  • variant: theme name such as dark_bold, dark_italic_bold
  • palette: the palette overridden after override_palette
require('Eva-Theme').setup({
  override_highlight = {
    --#region using callbacks can be more flexible
    ['@foo.bar.baz'] = function(variant, _)
      return { fg = variant == 'dark_bold' and '#RRGGBB' or '#RRGGBB' }
    end,
    LspInlayHint = function(_, palette)
      return { fg = palette.comment, bg = 'none' } -- use `none` to cancel the default value
    end
    --#endregion
  },
})

Ambiguity issue

This port was intended to respect the upstream where operators got different colors by their usages. Treesitter queries presets from nvim-treesitter generally don't classify operator by semantic, although it's approachable by custom query but I currently don't like to added it(pr welcome!). If you find ambiguity between operator and type(pointer type T* for example), I suggest customize by yourself.

For example:

require('Eva-Theme').setup({
  override_palette = {
    dark = {
      operator = require('Eva-Theme.palette').dark_base.punctuation,
    },
    light = {
      operator = require('Eva-Theme.palette').light_base.punctuation,
    },
  },
)

Contributing

See: CONTRIBUTING.md