Skip to content

Commit

Permalink
BREAKING CHANGE: gruvbox is now a single module
Browse files Browse the repository at this point in the history
palette: Can now be accessed in the main module through `require('gruvbox').palette`
get_base_colors: now a internal function called get_colors. If you want
to get the colors, just get the palette directly
groups: now moved to main module
  • Loading branch information
ellisonleao committed Sep 29, 2023
1 parent 65f2b9e commit e7b755d
Show file tree
Hide file tree
Showing 5 changed files with 231 additions and 235 deletions.
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ Neovim 0.8.0+

# Installing

Using `packer`
## Using `packer`

```lua
use { "ellisonleao/gruvbox.nvim" }
```

Using `lazy.nvim`
## Using `lazy.nvim`

```lua
{ "ellisonleao/gruvbox.nvim", priority = 1000 }
{ "ellisonleao/gruvbox.nvim", priority = 1000 , setup = true, opts = ...}
```

# Basic Usage
Expand All @@ -51,7 +51,6 @@ vim.cmd([[colorscheme gruvbox]])
Additional settings for gruvbox are:

```lua
-- setup must be called before loading the colorscheme
-- Default options:
require("gruvbox").setup({
terminal_colors = true, -- add neovim terminal colors
Expand Down Expand Up @@ -80,6 +79,8 @@ require("gruvbox").setup({
vim.cmd("colorscheme gruvbox")
```

**VERY IMPORTANT**: Make sure to call setup() **BEFORE** calling the colorscheme command, to use your custom configs

## Overriding

### Palette
Expand All @@ -95,8 +96,6 @@ require("gruvbox").setup({
vim.cmd("colorscheme gruvbox")
```

More colors in the [palette.lua](lua/gruvbox/palette.lua) file

### Highlight groups

If you don't enjoy the current color for a specific highlight group, now you can just override it in the setup. For
Expand Down
222 changes: 215 additions & 7 deletions lua/gruvbox/groups.lua → lua/gruvbox.lua
Original file line number Diff line number Diff line change
@@ -1,11 +1,192 @@
local M = {}
---@class Gruvbox
---@field config GruvboxConfig
---@field palette GruvboxPalette
local Gruvbox = {}

-- setup Gruvbox groups
---@param config GruvboxConfig
M.setup = function(config)
local colors = require("gruvbox.palette").get_base_colors(config.palette_overrides, vim.o.background, config.contrast)
---@alias Contrast "hard" | "soft" | ""

if config.terminal_colors then
---@class ItalicConfig
---@field strings boolean
---@field comments boolean
---@field operators boolean
---@field folds boolean
---@field emphasis boolean

---@class HighlightDefinition
---@field fg string?
---@field bg string?
---@field sp string?
---@field blend integer?
---@field bold boolean?
---@field standout boolean?
---@field underline boolean?
---@field undercurl boolean?
---@field underdouble boolean?
---@field underdotted boolean?
---@field strikethrough boolean?
---@field italic boolean?
---@field reverse boolean?
---@field nocombine boolean?

---@class GruvboxConfig
---@field terminal_colors boolean?
---@field undercurl boolean?
---@field underline boolean?
---@field bold boolean?
---@field italic ItalicConfig?
---@field strikethrough boolean?
---@field contrast Contrast?
---@field invert_selection boolean?
---@field invert_signs boolean?
---@field invert_tabline boolean?
---@field invert_intend_guides boolean?
---@field inverse boolean?
---@field overrides table<string, HighlightDefinition>?
---@field palette_overrides table<string, string>?
Gruvbox.config = {
terminal_colors = true,
undercurl = true,
underline = true,
bold = true,
italic = {
strings = true,
emphasis = true,
comments = true,
operators = false,
folds = true,
},
strikethrough = true,
invert_selection = false,
invert_signs = false,
invert_tabline = false,
invert_intend_guides = false,
inverse = true,
contrast = "",
palette_overrides = {},
overrides = {},
dim_inactive = false,
transparent_mode = false,
}

-- main gruvbox color palette
---@class GruvboxPalette
Gruvbox.palette = {
dark0_hard = "#1d2021",
dark0 = "#282828",
dark0_soft = "#32302f",
dark1 = "#3c3836",
dark2 = "#504945",
dark3 = "#665c54",
dark4 = "#7c6f64",
light0_hard = "#f9f5d7",
light0 = "#fbf1c7",
light0_soft = "#f2e5bc",
light1 = "#ebdbb2",
light2 = "#d5c4a1",
light3 = "#bdae93",
light4 = "#a89984",
bright_red = "#fb4934",
bright_green = "#b8bb26",
bright_yellow = "#fabd2f",
bright_blue = "#83a598",
bright_purple = "#d3869b",
bright_aqua = "#8ec07c",
bright_orange = "#fe8019",
neutral_red = "#cc241d",
neutral_green = "#98971a",
neutral_yellow = "#d79921",
neutral_blue = "#458588",
neutral_purple = "#b16286",
neutral_aqua = "#689d6a",
neutral_orange = "#d65d0e",
faded_red = "#9d0006",
faded_green = "#79740e",
faded_yellow = "#b57614",
faded_blue = "#076678",
faded_purple = "#8f3f71",
faded_aqua = "#427b58",
faded_orange = "#af3a03",
gray = "#928374",
}

-- get a hex list of gruvbox colors based on current bg and constrast config
local function get_colors()
local p = Gruvbox.palette

for color, hex in pairs(Gruvbox.config.palette_overrides) do
p[color] = hex
end

local bg = vim.o.background
local contrast = Gruvbox.config.contrast

local color_groups = {
dark = {
bg0 = p.dark0,
bg1 = p.dark1,
bg2 = p.dark2,
bg3 = p.dark3,
bg4 = p.dark4,
fg0 = p.light0,
fg1 = p.light1,
fg2 = p.light2,
fg3 = p.light3,
fg4 = p.light4,
red = p.bright_red,
green = p.bright_green,
yellow = p.bright_yellow,
blue = p.bright_blue,
purple = p.bright_purple,
aqua = p.bright_aqua,
orange = p.bright_orange,
neutral_red = p.neutral_red,
neutral_green = p.neutral_green,
neutral_yellow = p.neutral_yellow,
neutral_blue = p.neutral_blue,
neutral_purple = p.neutral_purple,
neutral_aqua = p.neutral_aqua,
gray = p.gray,
},
light = {
bg0 = p.light0,
bg1 = p.light1,
bg2 = p.light2,
bg3 = p.light3,
bg4 = p.light4,
fg0 = p.dark0,
fg1 = p.dark1,
fg2 = p.dark2,
fg3 = p.dark3,
fg4 = p.dark4,
red = p.faded_red,
green = p.faded_green,
yellow = p.faded_yellow,
blue = p.faded_blue,
purple = p.faded_purple,
aqua = p.faded_aqua,
orange = p.faded_orange,
neutral_red = p.neutral_red,
neutral_green = p.neutral_green,
neutral_yellow = p.neutral_yellow,
neutral_blue = p.neutral_blue,
neutral_purple = p.neutral_purple,
neutral_aqua = p.neutral_aqua,
gray = p.gray,
},
}

if contrast ~= nil and contrast ~= "" then
color_groups[bg].bg0 = p[bg .. string.format("0_%s", contrast)]
end

return color_groups[bg]
end

local function get_groups()
local colors = get_colors()
local config = Gruvbox.config

if Gruvbox.config.terminal_colors then
local term_colors = {
colors.bg0,
colors.neutral_red,
Expand Down Expand Up @@ -835,4 +1016,31 @@ M.setup = function(config)
return groups
end

return M
---@param config GruvboxConfig?
Gruvbox.setup = function(config)
Gruvbox.config = vim.tbl_deep_extend("force", Gruvbox.config, config or {})
end

--- main load function
Gruvbox.load = function()
if vim.version().minor < 8 then
vim.notify_once("gruvbox.nvim: you must use neovim 0.8 or higher")
return
end

-- reset colors
if vim.g.colors_name then
vim.cmd.hi("clear")
end
vim.g.colors_name = "gruvbox"
vim.o.termguicolors = true

local groups = get_groups()

-- add highlights
for group, settings in pairs(groups) do
vim.api.nvim_set_hl(0, group, settings)
end
end

return Gruvbox
97 changes: 0 additions & 97 deletions lua/gruvbox/init.lua

This file was deleted.

Loading

0 comments on commit e7b755d

Please sign in to comment.