Skip to content

Repository files navigation

arete.nvim

Collection of all protesilaos GNU Emacs themes ported for Neovim.

arete.nvim is built on a custom, highly optimized bytecode compiler and caching engine. It statically compiles your customization overrides and theme data into pure Lua bytecode. Yeah, it's fast.

Motivation & Philosophy

I've been using GNU Emacs for a very long time, and Prot's themes (especially the modus and ef families) were my daily drivers. When I started spending more time in Neovim, I genuinely felt like I was missing my right hand. The editor itself was fantastic, but none of the existing colorschemes could replicate that perfect balance of contrast, readability, and visual calm that Prot spent years perfecting.

I created arete.nvim because I wanted us (the Neovimers) to also have nice things, without having to compromise on color accuracy or settle for partial ports.

The name arete (ἀρετή) is the ancient Greek word for excellence. I'm trying to continue the legacy with the naming convention. This plugin is my attempt to bring that standard of visual excellence from the Emacs world to Neovim, without sacrificing the speed we expect from our editor.

Installation

lazy.nvim

{
  "szymonwilczek/arete.nvim",
  lazy = false,
  priority = 1000,
}

mini.deps

add("szymonwilczek/arete.nvim")

packer.nvim

use { "szymonwilczek/arete.nvim" }

vim-plug

Plug 'szymonwilczek/arete.nvim'

Configuration

local arete = require("arete")

arete.setup({
  -- Enable transparent background for the editor
  transparent = false,

  -- Use the bytecode cache engine (highly recommended for performance)
  cache = true,

  -- Set specific styles for specific syntax highlight groups
  -- Can be any valid attr-list value. See `:h nvim_set_hl`
  styles = {
    comments = { italic = true },
    keywords = { bold = true },
    types = { bold = true },
    functions = {},
    variables = {},
  },

  -- Direct, unconditional group overrides
  -- Can be a table or a function returning a table
  groups = {
    -- CustomHighlight = { fg = "#ff0000", bg = "NONE" },
  },

  -- Programmatic highlight overrides based on the loaded theme
  ---@param highlights table
  ---@param name string
  ---@return table
  on_highlights = function(highlights, name)
    -- return {
    --   NormalFloat = { fg = highlights.Normal.fg, bg = "NONE" },
    -- }
  end,
})

-- To apply a theme, simply use the standard Neovim colorscheme command
vim.cmd.colorscheme("ef-bio")

Customizing

arete.nvim exposes a small Lua API for loading themes, reading the current options, and inspecting the raw theme table used by the compiler.

API

local arete = require("arete")

-- Configure arete.nvim. Passing `theme` also loads it immediately.
arete.setup({
  theme = "ef-bio",
  transparent = false,
  cache = true,
})

-- Load a theme programmatically.
arete.load("ef-dream")

-- Read the raw theme table for integrations or custom tooling.
local ef_dream = arete.get_theme("ef-dream")

-- Inspect the active arete.nvim options.
local options = arete.options()

Overwriting Highlights

You can provide a callback to on_highlights inside your setup function. The function will be executed during the theme compilation phase and injected directly into the cache.

require("arete").setup({
  on_highlights = function(hls, name)
    local normal = hls.Normal or {}
    local comment = hls.Comment or normal

    local overrides = {
      NormalFloat = { fg = normal.fg, bg = "NONE" },
      MyObscurePluginHighlight = { fg = (hls.DiffAdd or normal).fg },
    }

    -- You can adjust behavior based on the theme name
    if name:find("dark") then
      overrides.FloatBorder = { fg = comment.fg, bg = "NONE" }
    else
      overrides.FloatBorder = { fg = normal.fg, bg = "NONE" }
    end

    return overrides
  end,
})

Themes Showcase

Ef Family

Light Themes

ef-arbutus

ef-arcadia

ef-cyprus

ef-day

ef-deuteranopia-light

ef-duo-light

ef-eagle

ef-elea-light

ef-frost

ef-kassio

ef-light

ef-maris-light

ef-melissa-light

ef-orange

ef-reverie

ef-spring

ef-summer

ef-trio-light

ef-tritanopia-light

Dark Themes

ef-atlantis

ef-autumn

ef-bio

ef-cherie

ef-dark

ef-deuteranopia-dark

ef-dream

ef-duo-dark

ef-elea-dark

ef-false

ef-fig

ef-maris-dark

ef-melissa-dark

ef-night

ef-owl

ef-rosa

ef-symbiosis

ef-tint

ef-trio-dark

ef-tritanopia-dark

ef-winter

Modus Family

Light Themes

modus-operandi

modus-operandi-deuteranopia

modus-operandi-tinted

modus-operandi-tritanopia

Dark Themes

modus-vivendi

modus-vivendi-deuteranopia

modus-vivendi-tinted

modus-vivendi-tritanopia

Tempus Family

Light Themes

tempus_dawn

tempus_day

tempus_fugit

tempus_past

tempus_totus

Dark Themes

tempus_autumn

tempus_classic

tempus_dusk

tempus_future

tempus_night

tempus_rift

tempus_spring

tempus_summer

tempus_tempest

tempus_warp

tempus_winter

Doric Family

Light Themes

doric-almond

doric-beach

doric-cherry

doric-coral

doric-earth

doric-jade

doric-light

doric-marble

doric-oak

doric-siren

doric-tiger

doric-wind

Dark Themes

doric-copper

doric-dark

doric-fire

doric-lion

doric-magma

doric-mermaid

doric-obsidian

doric-pine

doric-plum

doric-valley

doric-walnut

doric-water

Standard Family

Light Themes

standard-adwaita

standard-light

standard-light-tinted

Dark Themes

standard-dark

standard-dark-tinted

standard-wombat

Prot16 Family

Light Themes

prot16-alto-light

prot16-archaic-light

prot16-bionis-light

prot16-blau-light

prot16-camo-light

prot16-caprice-light

prot16-cyprium-light

prot16-equinox-light

prot16-ficus-light

prot16-flowerbed-light

prot16-fortuna-light

prot16-gaia-light

prot16-hinterland-light

prot16-hyperion-light

prot16-magus-light

prot16-nefelio-light

prot16-neptune-light

prot16-ocarina-light

prot16-oliveira-light

prot16-orionis-light

prot16-overgrowth-light

prot16-playa-light

prot16-sonho-light

prot16-symbiosis-light

prot16-termina-light

prot16-vin-light

Dark Themes

prot16-alto-dark

prot16-archaic-dark

prot16-bionis-dark

prot16-blau-dark

prot16-camo-dark

prot16-caprice-dark

prot16-cyprium-dark

prot16-equinox-dark

prot16-ficus-dark

prot16-flowerbed-dark

prot16-fortuna-dark

prot16-gaia-dark

prot16-hinterland-dark

prot16-hyperion-dark

prot16-magus-dark

prot16-nefelio-dark

prot16-neptune-dark

prot16-noir-light

prot16-noir-dark

prot16-ocarina-dark

prot16-oliveira-dark

prot16-orionis-dark

prot16-overgrowth-dark

prot16-playa-dark

prot16-seabed-light

prot16-seabed-dark

prot16-sonho-dark

prot16-symbiosis-dark

prot16-termina-dark

prot16-vin-dark

Contributing

Please read CONTRIBUTING.md before opening a pull request. It documents the required commit format, sign-off policy, theme documentation rules, and validation checks.

Acknowledgements

License

This project is licensed under the GNU General Public License v2.0 - see the LICENSE file for details.