Skip to content

Instantly share code, notes, and snippets.

@tjdevries
Created September 1, 2026 03:47
Show Gist options
  • Select an option

  • Save tjdevries/165da30ee91824773842653660ce2368 to your computer and use it in GitHub Desktop.

Select an option

Save tjdevries/165da30ee91824773842653660ce2368 to your computer and use it in GitHub Desktop.
-- 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