202 lines
7.7 KiB
Lua
202 lines
7.7 KiB
Lua
-- nighthawks.lua
|
|
-- Neovim colorscheme inspired by Edward Hopper's "Nighthawks" (1942)
|
|
-- Dark = cinematic nighttime neon
|
|
-- Light = soft morning reinterpretation
|
|
|
|
local variant = vim.g.nighthawks_variant or "dark"
|
|
|
|
local colors = {}
|
|
|
|
if variant == "dark" then
|
|
colors = {
|
|
bg = "#0e1a22", -- Deep midnight navy
|
|
fg = "#d4d8dc", -- Pale warm white
|
|
comment = "#6a7b85", -- Smoky teal-gray
|
|
red = "#d15b4d", -- Neon diner red
|
|
green = "#6fa88d", -- Jade counter green
|
|
yellow = "#e3c770", -- Warm interior light
|
|
blue = "#5a87a5", -- Windowpane blue
|
|
magenta = "#b67aa0", -- Soft wine glow
|
|
cyan = "#77aab7", -- Cool teal accent
|
|
cursorline = "#172730", -- Slightly lighter than bg
|
|
highlight = "#24404f", -- Dim cyan highlight
|
|
}
|
|
else
|
|
colors = {
|
|
bg = "#f6f4f2", -- Muted paper white
|
|
fg = "#2f3b44", -- Charcoal ink
|
|
comment = "#868d93", -- Cool gray
|
|
red = "#b14f42", -- Brick red
|
|
green = "#5d8b76", -- Muted jade
|
|
yellow = "#c8a856", -- Soft sunlight gold
|
|
blue = "#3f6c89", -- Subdued cobalt
|
|
magenta = "#9b6f86", -- Dusty rose
|
|
cyan = "#649aa5", -- Sky teal
|
|
cursorline = "#e3dfdc", -- Light stone gray
|
|
highlight = "#c2b89c", -- Warm neutral highlight
|
|
}
|
|
end
|
|
|
|
local function hi(group, opts)
|
|
vim.api.nvim_set_hl(0, group, opts)
|
|
end
|
|
|
|
-- Core UI
|
|
hi("Normal", { fg = colors.fg, bg = colors.bg })
|
|
hi("CursorLine", { bg = colors.cursorline })
|
|
hi("Visual", { bg = colors.highlight })
|
|
hi("LineNr", { fg = colors.comment })
|
|
hi("CursorLineNr",{ fg = colors.yellow, bold = true })
|
|
hi("VertSplit", { fg = colors.comment })
|
|
hi("StatusLine", { fg = colors.fg, bg = colors.cursorline })
|
|
hi("StatusLineNC",{ fg = colors.comment, bg = colors.cursorline })
|
|
hi("Pmenu", { fg = colors.fg, bg = colors.cursorline })
|
|
hi("PmenuSel", { fg = colors.bg, bg = colors.blue, bold = true })
|
|
hi("Search", { fg = colors.bg, bg = colors.yellow, bold = true })
|
|
hi("IncSearch", { fg = colors.bg, bg = colors.red, bold = true })
|
|
|
|
-- Syntax
|
|
hi("Comment", { fg = colors.comment, italic = true })
|
|
hi("Constant", { fg = colors.red })
|
|
hi("String", { fg = colors.yellow })
|
|
hi("Character", { fg = colors.yellow })
|
|
hi("Number", { fg = colors.cyan })
|
|
hi("Boolean", { fg = colors.cyan, bold = true })
|
|
hi("Float", { fg = colors.cyan })
|
|
|
|
hi("Identifier", { fg = colors.blue })
|
|
hi("Function", { fg = colors.green, bold = true })
|
|
|
|
hi("Statement", { fg = colors.blue })
|
|
hi("Conditional", { fg = colors.magenta })
|
|
hi("Repeat", { fg = colors.magenta })
|
|
hi("Label", { fg = colors.yellow })
|
|
hi("Operator", { fg = colors.fg })
|
|
hi("Keyword", { fg = colors.blue, bold = true })
|
|
hi("Exception", { fg = colors.red })
|
|
|
|
hi("PreProc", { fg = colors.magenta })
|
|
hi("Include", { fg = colors.blue })
|
|
hi("Define", { fg = colors.magenta })
|
|
hi("Macro", { fg = colors.magenta })
|
|
hi("PreCondit", { fg = colors.magenta })
|
|
|
|
hi("Type", { fg = colors.green })
|
|
hi("StorageClass",{ fg = colors.green })
|
|
hi("Structure", { fg = colors.green })
|
|
hi("Typedef", { fg = colors.green })
|
|
|
|
hi("Special", { fg = colors.cyan })
|
|
hi("SpecialChar", { fg = colors.yellow })
|
|
hi("Tag", { fg = colors.blue })
|
|
hi("Delimiter", { fg = colors.fg })
|
|
hi("SpecialComment",{ fg = colors.comment, italic = true })
|
|
hi("Debug", { fg = colors.red })
|
|
|
|
hi("Underlined", { fg = colors.blue, underline = true })
|
|
hi("Bold", { bold = true })
|
|
hi("Italic", { italic = true })
|
|
|
|
hi("Error", { fg = colors.red, bold = true })
|
|
hi("Todo", { fg = colors.yellow, bold = true })
|
|
hi("WarningMsg", { fg = colors.yellow })
|
|
hi("ErrorMsg", { fg = colors.red, bold = true })
|
|
|
|
-- Diagnostics (LSP)
|
|
hi("DiagnosticError", { fg = colors.red })
|
|
hi("DiagnosticWarn", { fg = colors.yellow })
|
|
hi("DiagnosticInfo", { fg = colors.blue })
|
|
hi("DiagnosticHint", { fg = colors.cyan })
|
|
|
|
hi("DiagnosticUnderlineError", { undercurl = true, sp = colors.red })
|
|
hi("DiagnosticUnderlineWarn", { undercurl = true, sp = colors.yellow })
|
|
hi("DiagnosticUnderlineInfo", { undercurl = true, sp = colors.blue })
|
|
hi("DiagnosticUnderlineHint", { undercurl = true, sp = colors.cyan })
|
|
|
|
-- LSP Semantic Tokens
|
|
hi("@lsp.type.class", { fg = colors.yellow })
|
|
hi("@lsp.type.function", { fg = colors.blue })
|
|
hi("@lsp.type.variable", { fg = colors.fg })
|
|
hi("@lsp.type.parameter", { fg = colors.cyan })
|
|
hi("@lsp.type.property", { fg = colors.green })
|
|
hi("@lsp.type.enum", { fg = colors.magenta })
|
|
|
|
-- Treesitter
|
|
hi("@comment", { fg = colors.comment, italic = true })
|
|
hi("@function", { fg = colors.blue })
|
|
hi("@keyword", { fg = colors.red, italic = true })
|
|
hi("@string", { fg = colors.green })
|
|
hi("@variable", { fg = colors.fg })
|
|
hi("@type", { fg = colors.yellow })
|
|
hi("@property", { fg = colors.green })
|
|
hi("@number", { fg = colors.magenta })
|
|
|
|
-- Telescope
|
|
hi("TelescopeBorder", { fg = colors.comment })
|
|
hi("TelescopePromptTitle",{ fg = colors.yellow, bold = true })
|
|
hi("TelescopeSelection", { bg = colors.cursorline })
|
|
hi("TelescopeMatching", { fg = colors.blue })
|
|
|
|
-- DAP (Debug)
|
|
hi("DebugBreakpoint", { fg = colors.red })
|
|
hi("DebugBreakpointLine", { bg = colors.cursorline })
|
|
hi("DebugPC", { bg = colors.highlight })
|
|
hi("DebugCurrentLine", { underline = true, sp = colors.yellow })
|
|
|
|
-- Pmenu (Completion)
|
|
hi("Pmenu", { fg = colors.fg, bg = colors.cursorline })
|
|
hi("PmenuSel", { fg = colors.bg, bg = colors.highlight })
|
|
hi("PmenuThumb", { bg = colors.highlight })
|
|
|
|
-- Notify / Noice / Snacks
|
|
hi("NotifyINFOBorder", { fg = colors.blue })
|
|
hi("NotifyWARNBorder", { fg = colors.yellow })
|
|
hi("NotifyERRORBorder", { fg = colors.red })
|
|
hi("NotifyDEBUGBorder", { fg = colors.cyan })
|
|
hi("NotifyTRACEBorder", { fg = colors.magenta })
|
|
|
|
hi("NoicePopup", { bg = colors.cursorline })
|
|
hi("NoicePopupmenu", { bg = colors.cursorline, fg = colors.fg })
|
|
|
|
-- Git Diff
|
|
hi("DiffAdd", { fg = colors.green })
|
|
hi("DiffChange", { fg = colors.blue })
|
|
hi("DiffDelete", { fg = colors.red })
|
|
|
|
-- Terminal Colors
|
|
vim.g.terminal_color_0 = colors.bg
|
|
vim.g.terminal_color_1 = colors.red
|
|
vim.g.terminal_color_2 = colors.green
|
|
vim.g.terminal_color_3 = colors.yellow
|
|
vim.g.terminal_color_4 = colors.blue
|
|
vim.g.terminal_color_5 = colors.magenta
|
|
vim.g.terminal_color_6 = colors.cyan
|
|
vim.g.terminal_color_7 = colors.fg
|
|
vim.g.terminal_color_8 = colors.comment
|
|
vim.g.terminal_color_9 = colors.red
|
|
vim.g.terminal_color_10 = colors.green
|
|
vim.g.terminal_color_11 = colors.yellow
|
|
vim.g.terminal_color_12 = colors.blue
|
|
vim.g.terminal_color_13 = colors.magenta
|
|
vim.g.terminal_color_14 = colors.cyan
|
|
vim.g.terminal_color_15 = colors.fg
|
|
|
|
-- Apply Snacks highlights unconditionally
|
|
hi("SnacksNormal", { fg = colors.fg, bg = colors.bg })
|
|
hi("SnacksNormalNC", { fg = colors.comment, bg = colors.bg })
|
|
hi("SnacksWinBar", { fg = colors.magenta, bg = colors.bg, bold = true })
|
|
hi("SnacksWinBarNC", { fg = colors.comment, bg = colors.bg })
|
|
hi("SnacksCursorLine", { bg = colors.highlight })
|
|
hi("SnacksCursor", { bg = colors.highlight })
|
|
hi("SnacksPickerFile", { fg = colors.green, bold = true })
|
|
hi("SnacksPickerDir", { fg = colors.comment })
|
|
hi("SnacksPickerPathHidden", { fg = colors.comment, italic = true })
|
|
hi("SnacksPickerPathIgnored",{ fg = colors.comment, italic = true })
|
|
hi("SnacksPickerPrefix", { fg = colors.yellow })
|
|
hi("SnacksPickerNormal", { fg = colors.fg, bg = colors.yellow }) -- Normal picker line
|
|
hi("SnacksPickerSelected", { fg = colors.bg, bg = colors.highlight }) -- Selected item (invert fg/bg)
|
|
hi("SnacksPickerCursor", { fg = colors.yellow, bg = colors.cursorline })
|
|
hi("NormalFloat", { fg = colors.fg, bg = colors.bg })
|
|
|
|
return colors
|