Skip to content

Commit

Permalink
parse_color: recognize "no$foo" to clear the $foo attribute
Browse files Browse the repository at this point in the history
You can turn on ANSI text attributes like "reverse" by
putting "reverse" in your color spec. However, you cannot
ask to turn reverse off.

For common cases, this does not matter. You would turn on
"reverse" at the start of a colored section, and then clear
all attributes with a "reset". However, you may wish to turn
on some attributes, then selectively disable others. For
example:

  git log --format="%C(bold ul yellow)%h%C(noul) %s"

underlines just the hash, but without the need to re-specify
the rest of the attributes. This can also help third-party
programs, like contrib/diff-highlight, that want to turn
some attribute on/off without disrupting existing coloring.

Note that some attribute specifications are probably
nonsensical (e.g., "bold nobold"). We do not bother to flag
such constructs, and instead let the terminal sort it out.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Nov 20, 2014
1 parent 17a4be2 commit ff40d18
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
3 changes: 2 additions & 1 deletion Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 5 additions & 3 deletions color.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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++)
Expand Down
4 changes: 2 additions & 2 deletions color.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ 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
*
* 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,
Expand Down
11 changes: 11 additions & 0 deletions t/t4026-color.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
'
Expand Down

0 comments on commit ff40d18

Please sign in to comment.