Colors are specified in color.interactive.{prompt,header,help}. They are specified as git color strings as described in the documentation. The method color_to_ansi_code() in Git.pm parses these strings and returns ANSI color codes (using Term::ANSIColor). Signed-off-by: Dan Zwell <dzwell@xxxxxxxxx> --- Documentation/config.txt | 7 ++++ git-add--interactive.perl | 20 ++++++++--- perl/Git.pm | 80 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 100 insertions(+), 7 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 3712d6a..47c1ab2 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -388,6 +388,13 @@ color.interactive:: `auto`, use colors only when the output is to the terminal. Defaults to false. +color.interactive.<slot>:: + Use customized color for `git add --interactive` + output. `<slot>` may be `prompt`, `header`, or `help`, for + three distinct types of normal output from interactive + programs. The values of these variables may be specified as + in color.branch.<slot>. + 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 2b5559f..f76f008 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -6,8 +6,8 @@ use Git; my ($use_color, $prompt_color, $header_color, $help_color, $normal_color); { - # set color options: my $repo = Git->repository(); + # set interactive color options: my $color_config = $repo->config('color.interactive'); $use_color = 0; if (!defined $color_config) { @@ -28,11 +28,19 @@ my ($use_color, $prompt_color, $header_color, $help_color, $normal_color); $use_color = 0; } else { # set up colors - # Sane (visible) defaults: - $prompt_color = Term::ANSIColor::color('blue bold'); - $header_color = Term::ANSIColor::color('bold'); - $help_color = Term::ANSIColor::color('red bold'); - $normal_color = Term::ANSIColor::color('reset'); + # Grab the 3 main colors in git color string format, with sane + # (visible) defaults: + $prompt_color = Git::color_to_ansi_code( + scalar $repo->config_default('color.interactive.prompt', + 'bold blue')); + $header_color = Git::color_to_ansi_code( + scalar $repo->config_default('color.interactive.header', + 'bold')); + $help_color = Git::color_to_ansi_code( + scalar $repo->config_default('color.interactive.help', + 'red bold')); + + $normal_color = Git::color_to_ansi_code('normal'); } } } diff --git a/perl/Git.pm b/perl/Git.pm index 7327300..18ef6b4 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -515,7 +515,6 @@ sub config { }; } - =item config_bool ( VARIABLE ) Retrieve the bool configuration C<VARIABLE>. The return value @@ -578,6 +577,85 @@ sub config_default { } } +=item color_to_ansi_code ( COLOR ) + +Converts a git-style color string, like "underline blue white" to +an ANSI color code. The code is generated by Term::ANSIColor, +after the string is parsed into the format that is accepted by +that module. Used as follows: + + print color_to_ansi_code("underline blue white"); + print "some text"; + print color_to_ansi_code("normal"); + +color_to_ansi_code('') returns the empty string, and should do +nothing when printed. + +=cut + +sub color_to_ansi_code { + my ($git_string) = @_; + my @ansi_words; + my %git_to_perl_color = ( + 'bold' => 'bold', + 'ul' => 'underline', + 'blink' => 'blink', + 'reverse' => 'reverse' + # not supported by Term::ANSIColor: + #'dim' => '' + ); + my %valid_color = map { $_ => 1 } qw(black red green yellow + blue magenta cyan white); + + my ($fg_done, $token); + foreach $token (split /\s+/, $git_string) { + $token = lc($token); + + if ($token eq 'normal') { + $fg_done = 1; + } + elsif (exists $valid_color{$token}) { + # is a color. + if ($fg_done) { + # this is the background + push @ansi_words, 'on_' . $token; + } + else { + # this is foreground + $fg_done = 1; + push @ansi_words, $token; + } + } + else { + # this is an attribute, not a color. + if ($git_to_perl_color{$token}) { + push(@ansi_words, + $git_to_perl_color{$token}); + } + else { + print STDERR 'Warning: bad color or attribute: '; + print STDERR "\"$token\". Check git configuration.\n"; + } + } + } + + # decide what to return--return color codes, 'clear' code, or + # the empty string, depending on the input we were passed / + # what we have processed: + if (@ansi_words) { + return Term::ANSIColor::color(join(' ', @ansi_words)); + } + else { + if ($fg_done) { + # the git attrib 'normal' was processed + return Term::ANSIColor::color('clear'); + } + else { + return ''; + } + } +} + =item ident ( TYPE | IDENTSTR ) =item ident_person ( TYPE | IDENTSTR | IDENTARRAY ) -- 1.5.3.5.565.gf0b83-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html