diff --git a/Documentation/config.txt b/Documentation/config.txt index 35b9731d49..51947a9e71 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -824,7 +824,8 @@ accepted are `normal`, `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan` and `white`; the attributes are `bold`, `dim`, `ul`, `blink` and `reverse`. The first color given is the foreground; the second is the background. The position of the attribute, if any, -doesn't matter. +doesn't matter. Attributes may be turned off specifically by prefixing +them with `no` (e.g., `noreverse`, `noul`, etc). + Colors (foreground and background) may also be given as numbers between 0 and 255; these use ANSI 256-color mode (but note that not all diff --git a/color.c b/color.c index ae68792923..e2a0a99164 100644 --- a/color.c +++ b/color.c @@ -124,9 +124,11 @@ static int parse_color(struct color *out, const char *name, int len) static int parse_attr(const char *name, int len) { - static const int attr_values[] = { 1, 2, 4, 5, 7 }; + static const int attr_values[] = { 1, 2, 4, 5, 7, + 22, 22, 24, 25, 27 }; static const char * const attr_names[] = { - "bold", "dim", "ul", "blink", "reverse" + "bold", "dim", "ul", "blink", "reverse", + "nobold", "nodim", "noul", "noblink", "noreverse" }; int i; for (i = 0; i < ARRAY_SIZE(attr_names); i++) { @@ -238,7 +240,7 @@ int color_parse_mem(const char *value, int value_len, char *dst) attr &= ~bit; if (sep++) *dst++ = ';'; - *dst++ = '0' + i; + dst += sprintf(dst, "%d", i); } if (!color_empty(&fg)) { if (sep++) diff --git a/color.h b/color.h index 4ec34b448f..7fe77fb55e 100644 --- a/color.h +++ b/color.h @@ -8,7 +8,7 @@ struct strbuf; /* * The maximum length of ANSI color sequence we would generate: * - leading ESC '[' 2 - * - attr + ';' 2 * 8 (e.g. "1;") + * - attr + ';' 3 * 10 (e.g. "1;") * - fg color + ';' 17 (e.g. "38;2;255;255;255;") * - bg color + ';' 17 (e.g. "48;2;255;255;255;") * - terminating 'm' NUL 2 @@ -16,7 +16,7 @@ struct strbuf; * The above overcounts attr (we only use 5 not 8) and one semicolon * but it is close enough. */ -#define COLOR_MAXLEN 56 +#define COLOR_MAXLEN 70 /* * IMPORTANT: Due to the way these color codes are emulated on Windows, diff --git a/t/t4026-color.sh b/t/t4026-color.sh index 65386db916..267c43bd95 100755 --- a/t/t4026-color.sh +++ b/t/t4026-color.sh @@ -45,10 +45,21 @@ test_expect_success 'fg bg attr...' ' color "blue bold dim ul blink reverse" "[1;2;4;5;7;34m" ' +# note that nobold and nodim are the same code (22) +test_expect_success 'attr negation' ' + color "nobold nodim noul noblink noreverse" "[22;24;25;27m" +' + test_expect_success 'long color specification' ' color "254 255 bold dim ul blink reverse" "[1;2;4;5;7;38;5;254;48;5;255m" ' +test_expect_success 'absurdly long color specification' ' + color \ + "#ffffff #ffffff bold nobold dim nodim ul noul blink noblink reverse noreverse" \ + "[1;2;4;5;7;22;24;25;27;38;2;255;255;255;48;2;255;255;255m" +' + test_expect_success '256 colors' ' color "254 bold 255" "[1;38;5;254;48;5;255m" '