Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BREAKING CHANGE: gruvbox is now a single module #280

Merged
merged 2 commits into from
Sep 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 19 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<a href="#"><img alt="Made with Lua" src="https://img.shields.io/badge/Made%20with%20Lua-blueviolet.svg?style=for-the-badge&logo=lua" style="vertical-align:center" /></a>
</p>

A port of [gruvbox community](https://github.com/gruvbox-community/gruvbox) theme to lua with [treesitter](https://github.com/nvim-treesitter/nvim-treesitter) support!
A port of [gruvbox community](https://github.com/gruvbox-community/gruvbox) theme to lua with [treesitter](https://github.com/nvim-treesitter/nvim-treesitter) and [semantic highlights](https://neovim.io/doc/user/lsp.html#lsp-semantic-highlight) support!

<p align="center">
<img src="https://i.postimg.cc/fy3tnGFt/gruvbox-themes.png" />
Expand All @@ -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 = ...}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There doesn't seem to be a setup property, seems you meant to use config instead. Also that would be unnecessary as setting opts "will imply Plugin.config()".

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@polyzen actualy it's a typo, using config with opts will basically call require('gruvbox').setup(opts). Will fix it

```

# 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 All @@ -111,11 +110,23 @@ require("gruvbox").setup({
vim.cmd("colorscheme gruvbox")
```

It also works with treesitter groups and lsp semantic highlight tokens

```lua
require("gruvbox").setup({
overrides = {
["@lsp.type.method"] = { bg = "#ff9900" },
["@comment.lua"] = { bg = "#000000" },
}
})
vim.cmd("colorscheme gruvbox")
```

Please note that the override values must follow the attributes from the highlight group map, such as:

- **fg** - foreground color
- **bg** - background color
- **bold** - true or false for bold font
- **italic** - true or false for italic font

Other values can be seen in `:h synIDattr`
Other values can be seen in [`synIDattr`](<https://neovim.io/doc/user/builtin.html#synIDattr()>)
270 changes: 257 additions & 13 deletions lua/gruvbox/groups.lua → lua/gruvbox.lua
Original file line number Diff line number Diff line change
@@ -1,9 +1,218 @@
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" | ""

---@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",
dark_red_hard = "#792329",
dark_red = "#722529",
dark_red_soft = "#7b2c2f",
light_red_hard = "#fc9690",
light_red = "#fc9487",
light_red_soft = "#f78b7f",
dark_green_hard = "#5a633a",
dark_green = "#62693e",
dark_green_soft = "#686d43",
light_green_hard = "#d3d6a5",
light_green = "#d5d39b",
light_green_soft = "#cecb94",
dark_aqua_hard = "#3e4934",
dark_aqua = "#49503b",
dark_aqua_soft = "#525742",
light_aqua_hard = "#e6e9c1",
light_aqua = "#e8e5b5",
light_aqua_soft = "#e1dbac",
gray = "#928374",
}

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

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

local bg = vim.o.background
local contrast = 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,
dark_red = p.dark_red,
dark_green = p.dark_green,
dark_aqua = p.dark_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,
dark_red = p.light_red,
dark_green = p.light_green,
dark_aqua = p.light_aqua,
gray = p.gray,
},
}

if contrast ~= nil and contrast ~= "" then
color_groups[bg].bg0 = p[bg .. "0_" .. contrast]
color_groups[bg].dark_red = p[bg .. "_red_" .. contrast]
color_groups[bg].dark_green = p[bg .. "_green_" .. contrast]
color_groups[bg].dark_aqua = p[bg .. "_aqua_" .. contrast]
end

return color_groups[bg]
end

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

if config.terminal_colors then
local term_colors = {
Expand Down Expand Up @@ -151,10 +360,10 @@ M.setup = function(config)
PmenuSel = { fg = colors.bg2, bg = colors.blue, bold = config.bold },
PmenuSbar = { bg = colors.bg2 },
PmenuThumb = { bg = colors.bg4 },
DiffDelete = { fg = colors.red, bg = colors.bg0, reverse = config.inverse },
DiffAdd = { fg = colors.green, bg = colors.bg0, reverse = config.inverse },
DiffChange = { fg = colors.aqua, bg = colors.bg0, reverse = config.inverse },
DiffText = { fg = colors.yellow, bg = colors.bg0, reverse = config.inverse },
DiffDelete = { bg = colors.dark_red },
DiffAdd = { bg = colors.dark_green },
DiffChange = { bg = colors.dark_aqua },
DiffText = { bg = colors.yellow },
SpellCap = { link = "GruvboxBlueUnderline" },
SpellBad = { link = "GruvboxRedUnderline" },
SpellLocal = { link = "GruvboxAquaUnderline" },
Expand All @@ -180,6 +389,7 @@ M.setup = function(config)
DiagnosticVirtualTextWarn = { link = "GruvboxYellow" },
DiagnosticVirtualTextInfo = { link = "GruvboxBlue" },
DiagnosticVirtualTextHint = { link = "GruvboxAqua" },
DiagnosticOk = { link = "GruvboxGreenSign" },
LspReferenceRead = { link = "GruvboxYellowBold" },
LspReferenceText = { link = "GruvboxYellowBold" },
LspReferenceWrite = { link = "GruvboxOrangeBold" },
Expand Down Expand Up @@ -302,9 +512,9 @@ M.setup = function(config)
CmpItemKindConstant = { link = "GruvboxOrange" },
CmpItemKindStruct = { link = "GruvboxYellow" },
CmpItemKindTypeParameter = { link = "GruvboxYellow" },
diffAdded = { link = "GruvboxGreen" },
diffRemoved = { link = "GruvboxRed" },
diffChanged = { link = "GruvboxAqua" },
diffAdded = { link = "DiffAdd" },
diffRemoved = { link = "DiffDelete" },
diffChanged = { link = "DiffChange" },
diffFile = { link = "GruvboxOrange" },
diffNewFile = { link = "GruvboxYellow" },
diffOldFile = { link = "GruvboxOrange" },
Expand Down Expand Up @@ -729,6 +939,13 @@ M.setup = function(config)
DapUIWatchesError = { link = "GruvboxRed" },
DapUIWatchesValue = { link = "GruvboxYellow" },
DapUIWinSelect = { link = "GruvboxYellow" },
NeogitDiffDelete = { link = "DiffDelete" },
NeogitDiffAdd = { link = "DiffAdd" },
NeogitHunkHeader = { link = "WinBar" },
NeogitHunkHeaderHighlight = { link = "WinBarNC" },
DiffviewStatusModified = { link = "GruvboxGreenBold" },
DiffviewFilePanelInsertions = { link = "GruvboxGreenBold" },
DiffviewFilePanelDeletions = { link = "GruvboxRedBold" },
["@comment"] = { link = "Comment" },
["@none"] = { bg = "NONE", fg = "NONE" },
["@preproc"] = { link = "PreProc" },
Expand Down Expand Up @@ -835,4 +1052,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