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.
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.
{
"szymonwilczek/arete.nvim",
lazy = false,
priority = 1000,
}add("szymonwilczek/arete.nvim")use { "szymonwilczek/arete.nvim" }Plug 'szymonwilczek/arete.nvim'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")arete.nvim exposes a small Lua API for loading themes, reading the current options, and inspecting the raw theme table used by the compiler.
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()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,
})Please read CONTRIBUTING.md before opening a pull request. It documents the required commit format, sign-off policy, theme documentation rules, and validation checks.
- Massive thanks to Protesilaos Stavrou (Prot) for the original color palette research and Emacs themes.
- Special thanks to oonamo/ef-themes.nvim for the Neovim Ef-themes implementation and inspiration.
This project is licensed under the GNU General Public License v2.0 - see the LICENSE file for details.






















































































































































