From: Jeff King <peff@peff.net>
To: Scott Baker <bakers@canbytel.com>
Cc: git@vger.kernel.org
Subject: Re: diff-highlight highlight words?
Date: Wed, 12 Nov 2014 02:56:09 -0500 [thread overview]
Message-ID: <20141112075609.GA21485@peff.net> (raw)
In-Reply-To: <5462907B.1050207@canbytel.com>
[+cc git@vger, since this may be of interest to others]
On Tue, Nov 11, 2014 at 02:40:59PM -0800, Scott Baker wrote:
> I'd like to recreate the github style diffs on the command line. It
> appears that your diff-highlight is very close. The current version only
> allows you to "invert the colors" which isn't ideal.
Yes, I never built any configurability into the script. However, you can
tweak the definitions at the top to get different effects.
Traditionally, ANSI colors on the terminal only came in two flavors:
"normal" and "bright" (which is attached to the "bold" attribute").
Instead of reversing video, you can switch on brightness like this:
diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight
index c4404d4..c99de99 100755
--- a/contrib/diff-highlight/diff-highlight
+++ b/contrib/diff-highlight/diff-highlight
@@ -5,8 +5,8 @@ use strict;
# Highlight by reversing foreground and background. You could do
# other things like bold or underline if you prefer.
-my $HIGHLIGHT = "\x1b[7m";
-my $UNHIGHLIGHT = "\x1b[27m";
+my $HIGHLIGHT = "\x1b[1m";
+my $UNHIGHLIGHT = "\x1b[22m";
my $COLOR = qr/\x1b\[[0-9;]*m/;
my $BORING = qr/$COLOR|\s/;
However on most modern terminals the color difference between bright and
normal is very subtle, and this doesn't look good.
XTerm (and other modern terminals) has 256-color support, so you could
do better there (assuming your terminal supports it). The current code
builds on the existing colors produced by git (because the operations
are only "invert colors" and "uninvert colors"). Doing anything fancier
requires handling add/del differently. That patch might look something
like this (which uses dark red/green for most of the line, and a much
brighter variant for the highlighted text):
diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight
index c4404d4..4e08f3c 100755
--- a/contrib/diff-highlight/diff-highlight
+++ b/contrib/diff-highlight/diff-highlight
@@ -5,11 +5,16 @@ use strict;
# Highlight by reversing foreground and background. You could do
# other things like bold or underline if you prefer.
-my $HIGHLIGHT = "\x1b[7m";
-my $UNHIGHLIGHT = "\x1b[27m";
my $COLOR = qr/\x1b\[[0-9;]*m/;
my $BORING = qr/$COLOR|\s/;
+# Elements:
+# 0 - highlighted text
+# 1 - unhighlighted text
+# 2 - reset to normal
+my @ADD_HIGHLIGHT = ("\x1b[38;2;100;255;100m", "\x1b[38;2;0;255;0m", "\x1b[30m");
+my @DEL_HIGHLIGHT = ("\x1b[38;2;255;100;100m", "\x1b[38;2;255;0;0m", "\x1b[30m");
+
my @removed;
my @added;
my $in_hunk;
@@ -128,8 +133,8 @@ sub highlight_pair {
}
if (is_pair_interesting(\@a, $pa, $sa, \@b, $pb, $sb)) {
- return highlight_line(\@a, $pa, $sa),
- highlight_line(\@b, $pb, $sb);
+ return highlight_line(\@a, $pa, $sa, @DEL_HIGHLIGHT),
+ highlight_line(\@b, $pb, $sb, @ADD_HIGHLIGHT);
}
else {
return join('', @a),
@@ -144,15 +149,18 @@ sub split_line {
}
sub highlight_line {
- my ($line, $prefix, $suffix) = @_;
+ my ($line, $prefix, $suffix, $highlight, $unhighlight, $reset) = @_;
- return join('',
+ my $r = join('',
+ $unhighlight,
@{$line}[0..($prefix-1)],
- $HIGHLIGHT,
+ $highlight,
@{$line}[$prefix..$suffix],
- $UNHIGHLIGHT,
- @{$line}[($suffix+1)..$#$line]
+ $unhighlight,
+ @{$line}[($suffix+1)..$#$line],
);
+ $r =~ s/\n$/$reset$&/;
+ return $r;
}
# Pairs are interesting to highlight only if we are going to end up
The result does not look terrible to me, though I think I find the
reverse-video more obvious when scanning the diff. To look more like
GitHub's view, you could instead set the background by doing this on
top:
diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight
index 4e08f3c..6f98db4 100755
--- a/contrib/diff-highlight/diff-highlight
+++ b/contrib/diff-highlight/diff-highlight
@@ -12,8 +12,8 @@ my $BORING = qr/$COLOR|\s/;
# 0 - highlighted text
# 1 - unhighlighted text
# 2 - reset to normal
-my @ADD_HIGHLIGHT = ("\x1b[38;2;100;255;100m", "\x1b[38;2;0;255;0m", "\x1b[30m");
-my @DEL_HIGHLIGHT = ("\x1b[38;2;255;100;100m", "\x1b[38;2;255;0;0m", "\x1b[30m");
+my @ADD_HIGHLIGHT = ("\x1b[30;48;2;100;255;100m", "\x1b[30;48;2;0;255;0m", "\x1b[0m");
+my @DEL_HIGHLIGHT = ("\x1b[30;48;2;255;100;100m", "\x1b[30;48;2;255;0;0m", "\x1b[0m");
my @removed;
my @added;
@@ -151,14 +151,18 @@ sub split_line {
sub highlight_line {
my ($line, $prefix, $suffix, $highlight, $unhighlight, $reset) = @_;
+ # strip out existing colors from git, which will clash
+ # both due to contrast and because of random ANSI resets
+ # inside the content
+ my $p = join('', @{$line}[0..($prefix-1)]);
+ my $t = join('', @{$line}[$prefix..$suffix]);
+ my $s = join('', @{$line}[($suffix+1)..$#$line]);
+ s/$COLOR//g for ($p, $t, $s);
+
my $r = join('',
- $unhighlight,
- @{$line}[0..($prefix-1)],
- $highlight,
- @{$line}[$prefix..$suffix],
- $unhighlight,
- @{$line}[($suffix+1)..$#$line],
- );
+ $unhighlight, $p,
+ $highlight, $t,
+ $unhighlight, $s);
$r =~ s/\n$/$reset$&/;
return $r;
}
I'm not wild about that either. I dunno. I still like the reverse-video
the best, but it may be that with a few tweaks somebody could make it
look less ugly.
-Peff
next parent reply other threads:[~2014-11-12 7:56 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <5462907B.1050207@canbytel.com>
2014-11-12 7:56 ` Jeff King [this message]
2014-11-12 17:59 ` diff-highlight highlight words? Scott Baker
2014-11-20 15:14 ` [PATCH 0/7] color fixes and configurable diff-highlight Jeff King
2014-11-20 15:15 ` [PATCH 1/7] docs: describe ANSI 256-color mode Jeff King
2014-11-20 15:15 ` [PATCH 2/7] config: fix parsing of "git config --get-color some.key -1" Jeff King
2014-11-20 15:16 ` [PATCH 3/7] t4026: test "normal" color Jeff King
2014-11-20 18:53 ` Junio C Hamano
2014-11-20 19:00 ` Jeff King
2014-11-20 15:17 ` [PATCH 4/7] parse_color: refactor color storage Jeff King
2014-11-20 19:37 ` Junio C Hamano
2014-12-09 20:14 ` Johannes Sixt
2014-12-09 20:21 ` Jeff King
2014-12-09 20:52 ` Johannes Sixt
2014-12-09 21:01 ` Jeff King
2014-12-09 20:56 ` Eric Sunshine
2014-11-20 15:25 ` [PATCH 5/7] parse_color: support 24-bit RGB values Jeff King
2014-11-20 19:44 ` Junio C Hamano
2014-11-20 20:10 ` Jeff King
2014-11-20 20:25 ` Junio C Hamano
2014-11-20 15:25 ` [PATCH 6/7] parse_color: recognize "no$foo" to clear the $foo attribute Jeff King
2014-11-20 19:46 ` Junio C Hamano
2014-11-20 15:29 ` [PATCH 7/7] diff-highlight: allow configurable colors Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141112075609.GA21485@peff.net \
--to=peff@peff.net \
--cc=bakers@canbytel.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).