Skip to content

sharpchen/Eva-Theme.nvim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

195 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Eva-Theme.nvim

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

dark light semantic
$\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.

{
  '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