Adds color to the prompts and output of git-add--interactive. -Reads config color.interactive, respects "auto", "true", "always", and anything else. -Uses the library Term::ANSIColor, which is included with modern versions of perl. This is optional, and should not need to be present if color.interactive is not on. -Reads color.interactive., where slot is "header", "prompt", or "help", colorizing output accordingly. Documentation/config.txt is updated to reflect the new keys. I cannot test this or see how it looks in manpages, however, as I cannot install the documentation build tools. Unfortunately, I think the default colors are ugly, but all colors that are readable on both black and white backgrounds are probably ugly. This patch does not colorize the diffs, because that is a larger job, and very distinct from this (simple) task. Dan gzipped patch is also attached, just in case. diff --git a/Documentation/config.txt b/Documentation/config.txt index 971fd9f..17e29e4 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -381,6 +381,27 @@ color.diff.:: whitespace). The values of these variables may be specified as in color.branch.. +color.interactive:: + When true (or `always`), always use colors in add--interactive. + When false (or `never`), never. When set to `auto`, use + colors only when the output is to the terminal. Defaults to + false. + +color.interactive.:: + Use customized color for add--interactive output. `` + may be `prompt`, `header`, or `help`, for three distinct types + of common output from interactive programs. The values may be a + space-delimited combination of up to three of the following: ++ +(optional attribute, optional foreground color, and optional background) ++ +dark, bold, underline, underscore, blink, reverse, concealed, +black, red, green, yellow, blue, magenta, cyan, white, on_black, +on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white ++ +Note: these are not the same colors/attributes that the +rest of git supports, but are specific to git-add--interactive. + color.pager:: A boolean to enable/disable colored output when the pager is in use (default is true). diff --git a/git-add--interactive.perl b/git-add--interactive.perl index be68814..125655b 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -2,6 +2,33 @@ use strict; +my ($use_color, $prompt_color, $header_color, $help_color); +my $color_config = qx(git config --get color.interactive); +if ($color_config=~/true|always/ || -t STDOUT && $color_config=~/auto/) { + $use_color = "true"; + chomp( $prompt_color = qx(git config --get color.interactive.prompt) ); + chomp( $header_color = qx(git config --get color.interactive.header) ); + chomp( $help_color = qx(git config --get color.interactive.help) ); + $prompt_color ||= "red bold"; + $header_color ||= "bold"; + $help_color ||= "blue bold"; + + require Term::ANSIColor; +} + +sub print_colored { + my $color = shift; + my @strings = @_; + + if ($use_color) { + print Term::ANSIColor::color($color); + print(@strings); + print Term::ANSIColor::color("reset"); + } else { + print @strings; + } +} + sub run_cmd_pipe { if ($^O eq 'MSWin32') { my @invalid = grep {m/[":*]/} @_; @@ -175,7 +202,7 @@ sub list_and_choose { if (!$opts->{LIST_FLAT}) { print " "; } - print "$opts->{HEADER}\n"; + print_colored $header_color, "$opts->{HEADER}\n"; } for ($i = 0; $i < @stuff; $i++) { my $chosen = $chosen[$i] ? '*' : ' '; @@ -205,7 +232,7 @@ sub list_and_choose { return if ($opts->{LIST_ONLY}); - print $opts->{PROMPT}; + print_colored $prompt_color, $opts->{PROMPT}; if ($opts->{SINGLETON}) { print "> "; } @@ -544,7 +571,7 @@ sub coalesce_overlapping_hunks { } sub help_patch_cmd { - print <<\EOF ; + print_colored $help_color, <<\EOF ; y - stage this hunk n - do not stage this hunk a - stage this and all the remaining hunks @@ -619,7 +646,7 @@ sub patch_update_cmd { for (@{$hunk[$ix]{TEXT}}) { print; } - print "Stage this hunk [y/n/a/d$other/?]? "; + print_colored $prompt_color, "Stage this hunk [y/n/a/d$other/?]? "; my $line = ; if ($line) { if ($line =~ /^y/i) { @@ -673,7 +700,7 @@ sub patch_update_cmd { elsif ($other =~ /s/ && $line =~ /^s/) { my @split = split_hunk($hunk[$ix]{TEXT}); if (1 < @split) { - print "Split into ", + print_colored "$header_color", "Split into ", scalar(@split), " hunks.\n"; } splice(@hunk, $ix, 1, @@ -769,7 +796,7 @@ sub quit_cmd { } sub help_cmd { - print <<\EOF ; + print_colored $help_color, <<\EOF ; status - show paths with changes update - add working tree state to the staged set of changes revert - revert staged set of changes back to the HEAD version -- 1.5.3.4.207.gc0ee