-- 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