https://en.wikipedia.org/wiki/ANSI_escape_code ANSI color codes 90-97 and 100-107 are brighter versions of the 30-37 and 40-47 colors. To view them, run `colortest-16`. In that colortest, they are named with a leading "+". Maybe git config could support those colors, too, with a leading plus in the name? They are nice for having a different shade of a color in a diff. Here's a patch with tests. I don't know how to submit it. Thoughts? Eyal diff --git a/color.c b/color.c index ebb222ec33..a39fe7d133 100644 --- a/color.c +++ b/color.c @@ -33,6 +33,7 @@ struct color { COLOR_UNSPECIFIED = 0, COLOR_NORMAL, COLOR_ANSI, /* basic 0-7 ANSI colors */ + COLOR_AXITERM, /* brighter than 0-7 ANSI colors */ COLOR_256, COLOR_RGB } type; @@ -95,6 +96,12 @@ static int parse_color(struct color *out, const char *name, int len) out->value = i; return 0; } + if (*name == '+' && + match_word(name+1, len-1, color_names[i])) { + out->type = COLOR_AXITERM; + out->value = i; + return 0; + } } /* And finally try a literal 256-color-mode number */ @@ -166,23 +173,24 @@ int color_parse(const char *value, char *dst) * already have the ANSI escape code in it. "out" should have enough * space in it to fit any color. */ -static char *color_output(char *out, int len, const struct color *c, char type) +static char *color_output(char *out, int len, const struct color *c, + const char *type) { switch (c->type) { case COLOR_UNSPECIFIED: case COLOR_NORMAL: break; case COLOR_ANSI: - if (len < 2) + case COLOR_AXITERM: + if (len < strlen(type) + 1) BUG("color parsing ran out of space"); - *out++ = type; - *out++ = '0' + c->value; + out += xsnprintf(out, len, "%s%c", type, '0' + c->value); break; case COLOR_256: - out += xsnprintf(out, len, "%c8;5;%d", type, c->value); + out += xsnprintf(out, len, "%s8;5;%d", type, c->value); break; case COLOR_RGB: - out += xsnprintf(out, len, "%c8;2;%d;%d;%d", type, + out += xsnprintf(out, len, "%s8;2;%d;%d;%d", type, c->red, c->green, c->blue); break; } @@ -279,14 +287,24 @@ int color_parse_mem(const char *value, int value_len, char *dst) if (!color_empty(&fg)) { if (sep++) OUT(';'); - /* foreground colors are all in the 3x range */ - dst = color_output(dst, end - dst, &fg, '3'); + /* foreground colors are in the 3x range */ + char *range = "3"; + if (fg.type == COLOR_AXITERM) { + /* axiterm fg colors are in the 9x range */ + range = "9"; + } + dst = color_output(dst, end - dst, &fg, range); } if (!color_empty(&bg)) { if (sep++) OUT(';'); /* background colors are all in the 4x range */ - dst = color_output(dst, end - dst, &bg, '4'); + char *range = "4"; + if (bg.type == COLOR_AXITERM) { + /* axiterm bg colors are in the 10x range */ + range = "10"; + } + dst = color_output(dst, end - dst, &bg, range); } OUT('m'); } diff --git a/t/t4026-color.sh b/t/t4026-color.sh index 671e951ee5..2b8430584f 100755 --- a/t/t4026-color.sh +++ b/t/t4026-color.sh @@ -30,6 +30,14 @@ test_expect_success 'attribute before color name' ' color "bold red" "[1;31m" ' +test_expect_success 'axiterm bright fg color' ' + color "+red" "[91m" +' + +test_expect_success 'axiterm bright bg color' ' + color "green +blue" "[32;104m" +' + test_expect_success 'color name before attribute' ' color "red bold" "[1;31m" '