Re: [PATCH] git-gui: highlight trailing whitespace in diff view
- From
Tor Arvid Lund <torarvid@gmail.com>
- Date
- Oct 20, 2010, 15:30 UTC
- Message-ID
- <AANLkTimrrxbKSYib7g0O5TXXwt5yDTdkt_bycs69mKT7@mail.gmail.com>
- In-Reply-To
- <87hbgh7paf.fsf@fox.patthoyts.tk>
On Wed, Oct 20, 2010 at 12:59 AM, Pat Thoyts <patthoyts@users.sourceforge.net> wrote:
Show 5 quoted lines
> Highlight any trailing whitespace in the diff view using a red background > as is done in the terminal when color is enabled. > > Suggested-by: Tor Arvid Lund <torarvid@gmail.com> > Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
Hey, Pat, and thanks for this. It solves my initial question. But in the time since I asked that question, I started thinking that it probably should honor the core.whitespace settings, and also work for, say, 'space-before-tab'. (You seem to say the same thing in your commit msg, I see)
I tried hacking it for a bit, but my Tcl knowledge is Absolute Zero, so it got frustrating pretty fast :)
Show 46 quoted lines
> ---
>
> Tor Arvid Lund <torarvid@gmail.com> writes:
>>Hi, all! When doing "git diff", whitespaces before EOL, for instance,
>>are marked with red background in my terminal.
>>
>>Is it possible to see this coloring in git gui too?
>>
>>-Tor Arvid-
>
> This patch should do the job. It probably should get some configuration
> item to control this though.
>
> git-gui.sh | 1 +
> lib/diff.tcl | 9 ++++++++-
> 2 files changed, 9 insertions(+), 1 deletions(-)
>
> diff --git a/git-gui.sh b/git-gui.sh
> index 25229a4..8d652f0 100755
> --- a/git-gui.sh
> +++ b/git-gui.sh
> @@ -3314,6 +3314,7 @@ pack .vpane.lower.diff.header -side top -fill x
> pack .vpane.lower.diff.body -side bottom -fill both -expand 1
>
> $ui_diff tag conf d_cr -elide true
> +$ui_diff tag conf ws -background red
> $ui_diff tag conf d_@ -foreground blue -font font_diffbold
> $ui_diff tag conf d_+ -foreground {#00a000}
> $ui_diff tag conf d_- -foreground red
> diff --git a/lib/diff.tcl b/lib/diff.tcl
> index c628750..83e3f6d 100644
> --- a/lib/diff.tcl
> +++ b/lib/diff.tcl
> @@ -434,7 +434,14 @@ proc read_diff {fd cont_info} {
> }
> }
> }
> - $ui_diff insert end $line $tags
> + if {[regexp -indices {^.*\S(\s+)$} $line -> ndx]} {
> + set ndx [expr {[lindex $ndx 0] - 1}]
> + set nonws [string range $line 0 $ndx]
> + $ui_diff insert end $nonws $tags \
> + [string range $line [incr ndx] end] [concat $tags ws]
> + } else {
> + $ui_diff insert end $line $tags
> + }<snip>
So - what I tried to do was expand on this (to include a 'space-before-tab' filter). I can't make a simple "elseif" for regexp "( +)\t" (or whatever the right regexp may be).
I mean that currently you can only match one ws-filter per line. So a line with both space-before-tab and blank-at-eol would not be printed correctly.
What I wanted to do, in pseudo-code, was:
read git config core.whitespace
for each diff-line #diff-line is any line starting with '+' or '-'
set temp-ui-line to $line $tags
if option_enabled core.whitespace.space-before-tab
if regexp_match space-before-tab-pattern -> indices
temp-ui-line.replace(indices[0], indices[1]) with-red-bg
if option_enabled core.whitespace.blank-at-eol
...
..
end for#and then $ui_diff insert end $temp-ui-line ------------------
Maybe this is the easiest thing in the world to do in Tcl, but I don't have more time to fiddle with it today :)
Thanks for the patch anyways.
-Tor Arvid-