Created
September 1, 2026 03:47
-
-
Save tjdevries/165da30ee91824773842653660ce2368 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- Local gruvbuddy: earthy accents (not pastel), but lifted so the | |
| -- editor doesn't feel like a turned-off monitor. | |
| vim.g.colors_name = "gruvbuddy" | |
| vim.o.termguicolors = true | |
| vim.o.background = "dark" | |
| local p = { | |
| bg = "#1c1b19", | |
| bg_dim = "#161513", | |
| bg_soft = "#252320", | |
| bg_hl = "#2e2b26", | |
| bg_sel = "#33404a", | |
| bg_search = "#453a24", | |
| fg = "#e6d5b3", | |
| fg_dim = "#a89780", | |
| fg_soft = "#d2c1a0", | |
| gray1 = "#2c2925", | |
| gray2 = "#454038", | |
| gray3 = "#857868", | |
| gray4 = "#a89780", | |
| gray5 = "#c4b494", | |
| linenr = "#5c5348", | |
| white = "#f0e0c0", | |
| red = "#d07068", | |
| green = "#9aaa6e", | |
| yellow = "#d8b66a", | |
| soft_yellow = "#c9a45a", | |
| blue = "#7e9fad", | |
| aqua = "#80a276", | |
| cyan = "#7aa3a0", | |
| purple = "#8a74a4", | |
| violet = "#ab8eab", | |
| orange = "#d89058", | |
| brown = "#a06f5a", | |
| seagreen = "#6f8a6f", | |
| diff_add = "#222e20", | |
| diff_change = "#222e2c", | |
| diff_delete = "#322020", | |
| diff_text = "#344842", | |
| } | |
| local function hi(group, opts) | |
| vim.api.nvim_set_hl(0, group, opts) | |
| end | |
| local function link(from, to) | |
| vim.api.nvim_set_hl(0, from, { link = to }) | |
| end | |
| -- Editor | |
| hi("Normal", { fg = p.fg, bg = p.bg }) | |
| hi("NormalNC", { fg = p.fg_soft, bg = p.bg }) | |
| hi("NormalFloat", { fg = p.fg, bg = p.bg }) | |
| hi("FloatBorder", { fg = p.gray3, bg = p.bg }) | |
| hi("FloatTitle", { fg = p.orange, bg = p.bg, bold = true }) | |
| hi("Cursor", { fg = p.bg, bg = p.fg }) | |
| hi("CursorLine", { bg = p.bg_soft }) | |
| hi("CursorColumn", { bg = p.bg_soft }) | |
| hi("CursorLineNr", { fg = p.soft_yellow, bg = p.bg_soft, bold = true }) | |
| hi("CursorLineSign", { fg = p.gray3, bg = p.bg_soft }) | |
| hi("CursorLineFold", { fg = p.linenr, bg = p.bg_soft }) | |
| hi("LineNr", { fg = p.linenr, bg = p.bg_dim }) | |
| hi("LineNrAbove", { fg = p.linenr, bg = p.bg_dim }) | |
| hi("LineNrBelow", { fg = p.linenr, bg = p.bg_dim }) | |
| hi("SignColumn", { fg = p.gray3, bg = p.bg_dim }) | |
| hi("ColorColumn", { bg = p.bg_soft }) | |
| hi("Folded", { fg = p.gray4, bg = p.bg_hl, italic = true }) | |
| hi("FoldColumn", { fg = p.linenr, bg = p.bg_dim }) | |
| hi("Visual", { bg = p.bg_sel }) | |
| hi("VisualNOS", { bg = p.bg_sel }) | |
| hi("Search", { fg = p.fg, bg = p.bg_search }) | |
| hi("IncSearch", { fg = p.bg, bg = p.orange, bold = true }) | |
| hi("CurSearch", { fg = p.bg, bg = p.orange, bold = true }) | |
| hi("MatchParen", { fg = p.orange, bold = true }) | |
| hi("VertSplit", { fg = p.gray2, bg = p.bg }) | |
| hi("WinSeparator", { fg = p.gray2, bg = p.bg }) | |
| hi("StatusLine", { fg = p.fg_soft, bg = p.gray1 }) | |
| hi("StatusLineNC", { fg = p.gray3, bg = p.bg_dim }) | |
| hi("StatusLineModeNormal", { fg = p.bg, bg = p.blue, bold = true }) | |
| hi("StatusLineModeInsert", { fg = p.bg, bg = p.green, bold = true }) | |
| hi("StatusLineModeVisual", { fg = p.bg, bg = p.violet, bold = true }) | |
| hi("StatusLineModeReplace", { fg = p.bg, bg = p.red, bold = true }) | |
| hi("StatusLineModeCommand", { fg = p.bg, bg = p.orange, bold = true }) | |
| hi("StatusLineModeTerminal", { fg = p.bg, bg = p.cyan, bold = true }) | |
| hi("StatusLineFile", { fg = p.fg, bg = p.gray1, bold = true }) | |
| hi("StatusLineModified", { fg = p.orange, bg = p.gray1, bold = true }) | |
| hi("StatusLineGit", { fg = p.aqua, bg = p.gray1 }) | |
| hi("StatusLineDiagError", { fg = p.red, bg = p.gray1, bold = true }) | |
| hi("StatusLineDiagWarn", { fg = p.soft_yellow, bg = p.gray1, bold = true }) | |
| hi("StatusLineDiagInfo", { fg = p.cyan, bg = p.gray1 }) | |
| hi("StatusLineDiagHint", { fg = p.seagreen, bg = p.gray1 }) | |
| hi("StatusLineInfo", { fg = p.gray4, bg = p.gray1 }) | |
| hi("StatusLineCursorBusy", { fg = p.orange, bg = p.gray1, bold = true }) | |
| hi("StatusLineCursorDone", { fg = p.green, bg = p.gray1, bold = true }) | |
| hi("StatusLineCursorUnread", { fg = p.soft_yellow, bg = p.gray1, bold = true }) | |
| hi("StatusLineCursorError", { fg = p.red, bg = p.gray1, bold = true }) | |
| hi("CursorChatUnread", { fg = p.soft_yellow, bold = true }) | |
| hi("CursorChatWorking", { fg = p.orange, bold = true }) | |
| hi("CursorChatDone", { fg = p.green }) | |
| hi("CursorChatError", { fg = p.red, bold = true }) | |
| hi("CursorChatArchived", { fg = p.gray4 }) | |
| hi("WinBar", { fg = p.fg_soft, bg = p.bg }) | |
| hi("WinBarNC", { fg = p.gray3, bg = p.bg }) | |
| hi("TabLine", { fg = p.gray4, bg = p.gray1 }) | |
| hi("TabLineFill", { fg = p.gray3, bg = p.bg_dim }) | |
| hi("TabLineSel", { fg = p.fg, bg = p.bg, bold = true }) | |
| hi("Pmenu", { fg = p.fg_soft, bg = p.bg }) | |
| hi("PmenuSel", { fg = p.fg, bg = p.bg_sel, bold = true }) | |
| hi("PmenuSbar", { bg = p.bg_soft }) | |
| hi("PmenuThumb", { bg = p.gray3 }) | |
| hi("Scrollbar", { fg = p.gray3, bg = p.bg }) | |
| hi("WildMenu", { fg = p.bg, bg = p.orange }) | |
| hi("NonText", { fg = p.gray2 }) | |
| hi("EndOfBuffer", { fg = p.bg }) | |
| hi("Whitespace", { fg = p.gray2 }) | |
| hi("SpecialKey", { fg = p.gray3 }) | |
| hi("Conceal", { fg = p.gray3 }) | |
| hi("Directory", { fg = p.orange }) | |
| hi("Title", { fg = p.orange, bold = true }) | |
| hi("Question", { fg = p.green }) | |
| hi("MoreMsg", { fg = p.green }) | |
| hi("ModeMsg", { fg = p.fg, bold = true }) | |
| hi("ErrorMsg", { fg = p.red, bold = true }) | |
| hi("WarningMsg", { fg = p.soft_yellow }) | |
| hi("MsgArea", { fg = p.fg_soft }) | |
| hi("DiffAdd", { bg = p.diff_add }) | |
| hi("DiffChange", { bg = p.diff_change }) | |
| hi("DiffDelete", { fg = p.red, bg = p.diff_delete }) | |
| hi("DiffText", { bg = p.diff_text }) | |
| hi("diffAdded", { fg = p.green }) | |
| hi("diffRemoved", { fg = p.red }) | |
| hi("diffChanged", { fg = p.orange }) | |
| -- Syntax | |
| hi("Comment", { fg = p.gray3, italic = true }) | |
| hi("Constant", { fg = p.orange }) | |
| hi("String", { fg = p.green }) | |
| hi("Character", { fg = p.green }) | |
| hi("Number", { fg = p.red }) | |
| hi("Boolean", { fg = p.orange }) | |
| hi("Float", { fg = p.red }) | |
| hi("Identifier", { fg = p.fg }) | |
| hi("Function", { fg = p.yellow }) | |
| hi("Statement", { fg = p.violet }) | |
| hi("Conditional", { fg = p.violet }) | |
| hi("Repeat", { fg = p.violet }) | |
| hi("Label", { fg = p.soft_yellow }) | |
| hi("Operator", { fg = p.cyan }) | |
| hi("Keyword", { fg = p.violet }) | |
| hi("Exception", { fg = p.red }) | |
| hi("PreProc", { fg = p.soft_yellow }) | |
| hi("Include", { fg = p.cyan }) | |
| hi("Define", { fg = p.cyan }) | |
| hi("Macro", { fg = p.orange }) | |
| hi("Type", { fg = p.violet, italic = true }) | |
| hi("StorageClass", { fg = p.soft_yellow }) | |
| hi("Structure", { fg = p.violet }) | |
| hi("Typedef", { fg = p.violet }) | |
| hi("Special", { fg = p.purple }) | |
| hi("SpecialChar", { fg = p.brown }) | |
| hi("Tag", { fg = p.soft_yellow }) | |
| hi("Delimiter", { fg = p.fg_dim }) | |
| hi("SpecialComment", { fg = p.gray4, italic = true }) | |
| hi("Underlined", { underline = true }) | |
| hi("Bold", { bold = true }) | |
| hi("Italic", { italic = true }) | |
| hi("Todo", { fg = p.yellow, bold = true }) | |
| hi("Error", { fg = p.red, bold = true }) | |
| -- Treesitter | |
| hi("@comment", { link = "Comment" }) | |
| hi("@comment.todo", { fg = p.yellow, bold = true }) | |
| hi("@comment.warning", { fg = p.orange, bold = true }) | |
| hi("@comment.error", { fg = p.red, bold = true }) | |
| hi("@comment.note", { fg = p.cyan, bold = true }) | |
| hi("@constant", { fg = p.orange }) | |
| hi("@constant.builtin", { fg = p.orange, bold = true }) | |
| hi("@constant.macro", { fg = p.orange }) | |
| hi("@boolean", { fg = p.orange }) | |
| hi("@number", { fg = p.red }) | |
| hi("@number.float", { fg = p.red }) | |
| hi("@string", { fg = p.green }) | |
| hi("@string.escape", { fg = p.cyan }) | |
| hi("@string.special", { fg = p.cyan }) | |
| hi("@character", { fg = p.green }) | |
| hi("@variable", { fg = p.fg }) | |
| hi("@variable.builtin", { fg = p.purple }) | |
| hi("@variable.parameter", { fg = p.fg_soft }) | |
| hi("@variable.member", { fg = p.blue }) | |
| hi("@property", { fg = p.blue }) | |
| hi("@field", { fg = p.blue }) | |
| hi("@function", { fg = p.yellow }) | |
| hi("@function.builtin", { fg = p.yellow, bold = true }) | |
| hi("@function.call", { fg = p.yellow }) | |
| hi("@function.method", { fg = p.yellow }) | |
| hi("@function.method.call", { fg = p.yellow }) | |
| hi("@function.call.lua", { fg = p.blue }) | |
| hi("@constructor", { fg = p.violet }) | |
| hi("@operator", { fg = p.cyan }) | |
| hi("@keyword", { fg = p.violet }) | |
| hi("@keyword.function", { fg = p.violet }) | |
| hi("@keyword.operator", { fg = p.violet }) | |
| hi("@keyword.return", { fg = p.violet }) | |
| hi("@keyword.import", { fg = p.cyan }) | |
| hi("@keyword.conditional", { fg = p.violet }) | |
| hi("@keyword.repeat", { fg = p.violet }) | |
| hi("@keyword.exception", { fg = p.red }) | |
| hi("@type", { fg = p.violet, italic = true }) | |
| hi("@type.builtin", { fg = p.violet, bold = true }) | |
| hi("@module", { fg = p.violet }) | |
| hi("@namespace", { fg = p.violet }) | |
| hi("@attribute", { fg = p.orange }) | |
| hi("@label", { fg = p.soft_yellow }) | |
| hi("@punctuation.delimiter", { fg = p.fg_dim }) | |
| hi("@punctuation.bracket", { fg = p.fg_dim }) | |
| hi("@punctuation.special", { fg = p.cyan }) | |
| hi("@tag", { fg = p.soft_yellow }) | |
| hi("@tag.attribute", { fg = p.violet, italic = true }) | |
| hi("@tag.delimiter", { fg = p.blue }) | |
| hi("@markup.heading", { fg = p.orange, bold = true }) | |
| hi("@markup.heading.1", { fg = p.orange, bold = true }) | |
| hi("@markup.heading.2", { fg = p.soft_yellow, bold = true }) | |
| hi("@markup.heading.3", { fg = p.blue, bold = true }) | |
| hi("@markup.strong", { bold = true }) | |
| hi("@markup.italic", { italic = true }) | |
| hi("@markup.strikethrough", { strikethrough = true }) | |
| hi("@markup.underline", { underline = true }) | |
| hi("@markup.link", { fg = p.blue, underline = true }) | |
| hi("@markup.link.url", { fg = p.cyan, underline = true }) | |
| hi("@markup.raw", { fg = p.green }) | |
| hi("@markup.list", { fg = p.orange }) | |
| hi("@markup.quote", { fg = p.gray4, italic = true }) | |
| hi("@diff.plus", { fg = p.green }) | |
| hi("@diff.minus", { fg = p.red }) | |
| hi("@diff.delta", { fg = p.orange }) | |
| -- LSP / Diagnostics | |
| hi("DiagnosticError", { fg = p.red }) | |
| hi("DiagnosticWarn", { fg = p.soft_yellow }) | |
| hi("DiagnosticInfo", { fg = p.cyan }) | |
| hi("DiagnosticHint", { fg = p.seagreen }) | |
| hi("DiagnosticOk", { fg = p.green }) | |
| hi("DiagnosticUnderlineError", { undercurl = true, sp = p.red }) | |
| hi("DiagnosticUnderlineWarn", { undercurl = true, sp = p.soft_yellow }) | |
| hi("DiagnosticUnderlineInfo", { undercurl = true, sp = p.cyan }) | |
| hi("DiagnosticUnderlineHint", { undercurl = true, sp = p.seagreen }) | |
| hi("DiagnosticVirtualTextError", { fg = p.red, bg = "#221414" }) | |
| hi("DiagnosticVirtualTextWarn", { fg = p.soft_yellow, bg = "#221e14" }) | |
| hi("DiagnosticVirtualTextInfo", { fg = p.cyan, bg = "#142022" }) | |
| hi("DiagnosticVirtualTextHint", { fg = p.seagreen, bg = "#142014" }) | |
| hi("LspReferenceText", { bg = p.bg_hl }) | |
| hi("LspReferenceRead", { bg = p.bg_hl }) | |
| hi("LspReferenceWrite", { bg = p.bg_hl }) | |
| hi("LspSignatureActiveParameter", { fg = p.orange, bold = true }) | |
| hi("LspInlayHint", { fg = p.gray3, italic = true }) | |
| link("@lsp.type.variable", "@variable") | |
| link("@lsp.type.property", "@property") | |
| link("@lsp.type.function", "@function") | |
| link("@lsp.type.method", "@function.method") | |
| link("@lsp.type.parameter", "@variable.parameter") | |
| link("@lsp.type.keyword", "@keyword") | |
| link("@lsp.type.string", "@string") | |
| link("@lsp.type.number", "@number") | |
| -- Telescope | |
| hi("TelescopeNormal", { fg = p.fg_soft, bg = p.bg }) | |
| hi("TelescopeBorder", { fg = p.gray3, bg = p.bg }) | |
| hi("TelescopeTitle", { fg = p.orange, bold = true }) | |
| hi("TelescopePromptNormal", { fg = p.fg, bg = p.bg }) | |
| hi("TelescopePromptBorder", { fg = p.gray3, bg = p.bg }) | |
| hi("TelescopePromptTitle", { fg = p.bg, bg = p.orange, bold = true }) | |
| hi("TelescopePromptPrefix", { fg = p.orange }) | |
| hi("TelescopePromptCounter", { fg = p.gray3 }) | |
| hi("TelescopeResultsTitle", { fg = p.bg, bg = p.blue }) | |
| hi("TelescopePreviewTitle", { fg = p.bg, bg = p.green }) | |
| hi("TelescopeSelection", { fg = p.fg, bg = p.bg_sel, bold = true }) | |
| hi("TelescopeSelectionCaret", { fg = p.orange, bg = p.bg_sel }) | |
| hi("TelescopeMatching", { fg = p.orange, bold = true }) | |
| hi("TelescopeMultiSelection", { fg = p.purple }) | |
| -- Notifications | |
| hi("NotifyError", { fg = p.fg, bg = "#221414" }) | |
| hi("NotifyErrorBorder", { fg = p.red, bg = "#221414" }) | |
| hi("NotifyErrorTitle", { fg = p.red, bg = "#221414", bold = true }) | |
| hi("NotifyWarn", { fg = p.fg, bg = "#221e14" }) | |
| hi("NotifyWarnBorder", { fg = p.soft_yellow, bg = "#221e14" }) | |
| hi("NotifyWarnTitle", { fg = p.soft_yellow, bg = "#221e14", bold = true }) | |
| hi("NotifyInfo", { fg = p.fg, bg = "#142022" }) | |
| hi("NotifyInfoBorder", { fg = p.cyan, bg = "#142022" }) | |
| hi("NotifyInfoTitle", { fg = p.cyan, bg = "#142022", bold = true }) | |
| hi("NotifyDebug", { fg = p.fg_soft, bg = p.bg_soft }) | |
| hi("NotifyDebugBorder", { fg = p.gray3, bg = p.bg_soft }) | |
| hi("NotifyDebugTitle", { fg = p.gray4, bg = p.bg_soft }) | |
| hi("NotifyTrace", { fg = p.fg_soft, bg = p.bg_soft }) | |
| hi("NotifyTraceBorder", { fg = p.purple, bg = p.bg_soft }) | |
| hi("NotifyTraceTitle", { fg = p.violet, bg = p.bg_soft }) | |
| -- NetRW / directory buffers | |
| hi("netrwDir", { fg = p.orange }) | |
| hi("netrwClassify", { fg = p.cyan }) | |
| hi("netrwExe", { fg = p.green }) | |
| hi("netrwSymLink", { fg = p.cyan, italic = true }) | |
| -- Terminal ANSI | |
| vim.g.terminal_color_0 = p.bg | |
| vim.g.terminal_color_1 = p.red | |
| vim.g.terminal_color_2 = p.green | |
| vim.g.terminal_color_3 = p.soft_yellow | |
| vim.g.terminal_color_4 = p.blue | |
| vim.g.terminal_color_5 = p.violet | |
| vim.g.terminal_color_6 = p.cyan | |
| vim.g.terminal_color_7 = p.fg | |
| vim.g.terminal_color_8 = p.gray3 | |
| vim.g.terminal_color_9 = p.red | |
| vim.g.terminal_color_10 = p.green | |
| vim.g.terminal_color_11 = p.yellow | |
| vim.g.terminal_color_12 = p.blue | |
| vim.g.terminal_color_13 = p.purple | |
| vim.g.terminal_color_14 = p.aqua | |
| vim.g.terminal_color_15 = p.white |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment