From fa2660455af86e14d85a3d85b44b7f4a37a5de5e Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sun, 5 Oct 2025 12:38:49 -0400 Subject: [PATCH] default ansi colors --- doc/cp.nvim.txt | 30 -------------- lua/cp/ui/ansi.lua | 98 ++++++++++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 73 deletions(-) diff --git a/doc/cp.nvim.txt b/doc/cp.nvim.txt index bc22741..6501c17 100644 --- a/doc/cp.nvim.txt +++ b/doc/cp.nvim.txt @@ -452,36 +452,6 @@ cp.nvim preserves ANSI colors from compiler output and program stderr using a sophisticated parsing system. Colors are automatically mapped to your terminal colorscheme via vim.g.terminal_color_* variables. -Basic formatting groups: - CpAnsiBold Bold text formatting - CpAnsiItalic Italic text formatting - CpAnsiBoldItalic Combined bold and italic formatting - -Standard terminal colors (each supports Bold, Italic, BoldItalic variants): - CpAnsiRed Standard red (terminal_color_1) - CpAnsiGreen Standard green (terminal_color_2) - CpAnsiYellow Standard yellow (terminal_color_3) - CpAnsiBlue Standard blue (terminal_color_4) - CpAnsiMagenta Standard magenta (terminal_color_5) - CpAnsiCyan Standard cyan (terminal_color_6) - CpAnsiWhite Standard white (terminal_color_7) - CpAnsiBlack Standard black (terminal_color_0) - -Bright color variants: - CpAnsiBrightRed Bright red (terminal_color_9) - CpAnsiBrightGreen Bright green (terminal_color_10) - CpAnsiBrightYellow Bright yellow (terminal_color_11) - CpAnsiBrightBlue Bright blue (terminal_color_12) - CpAnsiBrightMagenta Bright magenta (terminal_color_13) - CpAnsiBrightCyan Bright cyan (terminal_color_14) - CpAnsiBrightWhite Bright white (terminal_color_15) - CpAnsiBrightBlack Bright black (terminal_color_8) - -Example combinations: - CpAnsiBoldRed Bold red combination - CpAnsiItalicGreen Italic green combination - CpAnsiBoldItalicYellow Bold italic yellow combination - Diff Highlighting ~ The git diff backend uses Neovim's built-in highlight groups that automatically diff --git a/lua/cp/ui/ansi.lua b/lua/cp/ui/ansi.lua index 8bc8581..a72bcad 100644 --- a/lua/cp/ui/ansi.lua +++ b/lua/cp/ui/ansi.lua @@ -10,10 +10,46 @@ local M = {} -local logger = require('cp.log') - local dyn_hl_cache = {} +local ANSI_TERMINAL_COLOR_CODE_FALLBACK = { + [0] = '#000000', + [1] = '#800000', + [2] = '#008000', + [3] = '#808000', + [4] = '#000080', + [5] = '#800080', + [6] = '#008080', + [7] = '#c0c0c0', + [8] = '#808080', + [9] = '#ff0000', + [10] = '#00ff00', + [11] = '#ffff00', + [12] = '#0000ff', + [13] = '#ff00ff', + [14] = '#00ffff', + [15] = '#ffffff', +} + +local function xterm_to_hex(n) + if n >= 0 and n <= 15 then + local key = 'terminal_color_' .. n + return vim.g[key] or ANSI_TERMINAL_COLOR_CODE_FALLBACK[n] + end + if n >= 16 and n <= 231 then + local c = n - 16 + local r = math.floor(c / 36) % 6 + local g = math.floor(c / 6) % 6 + local b = c % 6 + local function level(x) + return x == 0 and 0 or 55 + 40 * x + end + return ('#%02x%02x%02x'):format(level(r), level(g), level(b)) + end + local l = 8 + 10 * (n - 232) + return ('#%02x%02x%02x'):format(l, l, l) +end + ---@param s string|table ---@return string function M.bytes_to_string(s) @@ -40,24 +76,7 @@ local function ensure_hl_for(fg, bold, italic) suffix = fg.name elseif fg and fg.kind == 'xterm' then suffix = ('X%03d'):format(fg.idx) - local function xterm_to_hex(n) - if n >= 0 and n <= 15 then - local key = 'terminal_color_' .. n - return vim.g[key] - end - if n >= 16 and n <= 231 then - local c = n - 16 - local r = math.floor(c / 36) % 6 - local g = math.floor(c / 6) % 6 - local b = c % 6 - local function level(x) - return x == 0 and 0 or 55 + 40 * x - end - return ('#%02x%02x%02x'):format(level(r), level(g), level(b)) - end - local l = 8 + 10 * (n - 232) - return ('#%02x%02x%02x'):format(l, l, l) - end + opts.fg = xterm_to_hex(fg.idx) or 'NONE' elseif fg and fg.kind == 'rgb' then suffix = ('Rgb%02x%02x%02x'):format(fg.r, fg.g, fg.b) @@ -256,31 +275,24 @@ end ---@return nil function M.setup_highlight_groups() local color_map = { - Black = vim.g.terminal_color_0, - Red = vim.g.terminal_color_1, - Green = vim.g.terminal_color_2, - Yellow = vim.g.terminal_color_3, - Blue = vim.g.terminal_color_4, - Magenta = vim.g.terminal_color_5, - Cyan = vim.g.terminal_color_6, - White = vim.g.terminal_color_7, - BrightBlack = vim.g.terminal_color_8, - BrightRed = vim.g.terminal_color_9, - BrightGreen = vim.g.terminal_color_10, - BrightYellow = vim.g.terminal_color_11, - BrightBlue = vim.g.terminal_color_12, - BrightMagenta = vim.g.terminal_color_13, - BrightCyan = vim.g.terminal_color_14, - BrightWhite = vim.g.terminal_color_15, + Black = vim.g.terminal_color_0 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[0], + Red = vim.g.terminal_color_1 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[1], + Green = vim.g.terminal_color_2 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[2], + Yellow = vim.g.terminal_color_3 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[3], + Blue = vim.g.terminal_color_4 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[4], + Magenta = vim.g.terminal_color_5 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[5], + Cyan = vim.g.terminal_color_6 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[6], + White = vim.g.terminal_color_7 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[7], + BrightBlack = vim.g.terminal_color_8 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[8], + BrightRed = vim.g.terminal_color_9 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[9], + BrightGreen = vim.g.terminal_color_10 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[10], + BrightYellow = vim.g.terminal_color_11 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[11], + BrightBlue = vim.g.terminal_color_12 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[12], + BrightMagenta = vim.g.terminal_color_13 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[13], + BrightCyan = vim.g.terminal_color_14 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[14], + BrightWhite = vim.g.terminal_color_15 or ANSI_TERMINAL_COLOR_CODE_FALLBACK[15], } - if vim.tbl_count(color_map) < 16 then - logger.log( - 'ansi terminal colors (vim.g.terminal_color_*) not configured. ANSI colors will not display properly.', - vim.log.levels.WARN - ) - end - local combinations = { { bold = false, italic = false }, { bold = true, italic = false },