# A better git diff --word-diff (--word-diff-regex) ?

7 messages from 2012-03-19 to 2012-03-19. Participants: Piotr Krukowiecki, Matthieu Moy, Thomas Rast, Johannes Sixt, Jeff King.
Thread: https://gitlist.dev/t/29991

## Piotr Krukowiecki, 2012-03-19 09:44

Subject: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <CAA01CsrJ12LmNYe6ujnDsZecJcGc8mFaB=1GC8-RZzvMYbYuUw@mail.gmail.com>
URL: https://gitlist.dev/e/CAA01CsrJ12LmNYe6ujnDsZecJcGc8mFaB%3D1GC8-RZzvMYbYuUw%40mail.gmail.com

```
Hi,

is there a way to configure --word-diff to be a more programming
language friendly? For example if I add one parameter to a function
declaration, I'd like to see only the addition of the parameter as the
change. But currently it shows much more.

For example if
  void foo(int x);
is changed to
  void foo(int x, int y);
I'd like to see only ",int y" as the change, not "x, int y);".

I think I'd like to ignore all white spaces and tokenize text on word
boundaries and see the diff between the tokens. This way if I e.g. add
a missing ";" it'll be shown as the only change.


$ echo 'void foo(int x);' > foo.c && git add foo.c && git commit -m "foo"
[master (root-commit) 5af60cb2] foo
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo.c

$ echo 'void foo(int x, int y);' > foo.c && git diff --word-diff
diff --git a/foo.c b/foo.c
index 42a5d4e9..289eb233 100644
--- a/foo.c
+++ b/foo.c
@@ -1 +1 @@
void foo(int [-x);-]{+x, int y);+}


Thanks,
-- 
Piotr Krukowiecki

```

## Matthieu Moy, 2012-03-19 09:47

Subject: Re: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <vpqvcm0exc4.fsf@bauges.imag.fr>
URL: https://gitlist.dev/e/vpqvcm0exc4.fsf%40bauges.imag.fr
In-Reply-To: <CAA01CsrJ12LmNYe6ujnDsZecJcGc8mFaB=1GC8-RZzvMYbYuUw@mail.gmail.com>

```
Piotr Krukowiecki <piotr.krukowiecki@gmail.com> writes:

> Hi,
>
> is there a way to configure --word-diff to be a more programming
> language friendly?

I often use this:

  git diff --color-words=.

It's rather bad on plain text, since it will try to diff within words,
but works well on source code.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

```

## Thomas Rast, 2012-03-19 09:50

Subject: Re: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <87ipi0vs0q.fsf@thomas.inf.ethz.ch>
URL: https://gitlist.dev/e/87ipi0vs0q.fsf%40thomas.inf.ethz.ch
In-Reply-To: <CAA01CsrJ12LmNYe6ujnDsZecJcGc8mFaB=1GC8-RZzvMYbYuUw@mail.gmail.com>

```
Piotr Krukowiecki <piotr.krukowiecki@gmail.com> writes:

> is there a way to configure --word-diff to be a more programming
> language friendly? For example if I add one parameter to a function
> declaration, I'd like to see only the addition of the parameter as the
> change. But currently it shows much more.
>
> For example if
>   void foo(int x);
> is changed to
>   void foo(int x, int y);
> I'd like to see only ",int y" as the change, not "x, int y);".
>
> I think I'd like to ignore all white spaces and tokenize text on word
> boundaries and see the diff between the tokens. This way if I e.g. add
> a missing ";" it'll be shown as the only change.

Umm, what's wrong with

  echo '*.cpp diff=cpp' >>.git/info/attributes

Ok, the funcname patterns aren't so good, but the word regex is designed
to "tokenize" as far as that is feasible.

-- 
Thomas Rast
trast@{inf,student}.ethz.ch

```

## Johannes Sixt, 2012-03-19 09:58

Subject: Re: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <4F67033B.2060904@viscovery.net>
URL: https://gitlist.dev/e/4F67033B.2060904%40viscovery.net
In-Reply-To: <CAA01CsrJ12LmNYe6ujnDsZecJcGc8mFaB=1GC8-RZzvMYbYuUw@mail.gmail.com>

```
Am 3/19/2012 10:44, schrieb Piotr Krukowiecki:
> is there a way to configure --word-diff to be a more programming
> language friendly? For example if I add one parameter to a function
> declaration, I'd like to see only the addition of the parameter as the
> change. But currently it shows much more.
> 
> For example if
>   void foo(int x);
> is changed to
>   void foo(int x, int y);
> I'd like to see only ",int y" as the change, not "x, int y);".
> 
> I think I'd like to ignore all white spaces and tokenize text on word
> boundaries and see the diff between the tokens. This way if I e.g. add
> a missing ";" it'll be shown as the only change.

Start with

   git config diff.wordregex '[[:alnum:]]+|[^[:space:]]'

Adjust to your likings.

-- Hannes

```

## Jeff King, 2012-03-19 15:10

Subject: Re: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <20120319151028.GC24848@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20120319151028.GC24848%40sigill.intra.peff.net
In-Reply-To: <CAA01CsrJ12LmNYe6ujnDsZecJcGc8mFaB=1GC8-RZzvMYbYuUw@mail.gmail.com>

```
On Mon, Mar 19, 2012 at 10:44:31AM +0100, Piotr Krukowiecki wrote:

> is there a way to configure --word-diff to be a more programming
> language friendly? For example if I add one parameter to a function
> declaration, I'd like to see only the addition of the parameter as the
> change. But currently it shows much more.
> 
> For example if
>   void foo(int x);
> is changed to
>   void foo(int x, int y);
> I'd like to see only ",int y" as the change, not "x, int y);".

This does not directly answer your question, but you may want to look at
the diff-highlight script in contrib/diff-highlight. I wrote it because
I found word-diff often unreadable, but still wanted something to
highlight small changes on a line like this.

On your example, it produces:

  -void foo(int x);
  +void foo(int x{+, int y});

except that the {+...} bit is highlighted by color, which makes it quite
readable.

-Peff

```

## Piotr Krukowiecki, 2012-03-19 16:54

Subject: Re: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <CAA01CsqcDsK2-n6npQiiO2=ux0JdUU-Sq6ceHrc0A9q2hjQC3w@mail.gmail.com>
URL: https://gitlist.dev/e/CAA01CsqcDsK2-n6npQiiO2%3Dux0JdUU-Sq6ceHrc0A9q2hjQC3w%40mail.gmail.com
In-Reply-To: <vpqvcm0exc4.fsf@bauges.imag.fr>

```
On Mon, Mar 19, 2012 at 10:47 AM, Matthieu Moy
<Matthieu.Moy@grenoble-inp.fr> wrote:
> Piotr Krukowiecki <piotr.krukowiecki@gmail.com> writes:
>
>> Hi,
>>
>> is there a way to configure --word-diff to be a more programming
>> language friendly?
>
> I often use this:
>
>  git diff --color-words=.
>
> It's rather bad on plain text, since it will try to diff within words,
> but works well on source code.

Hi,

thanks for the idea, it's surely useful in many cases, but it can look
confusing on source code too. For example on git b3256eb8b in path.c
one part of the diff is

-                       if (!access(used_path, F_OK)) {
+                       if (!stat(used_path, &st) &&
+                           (S_ISREG(st.st_mode) ||
+                           (S_ISDIR(st.st_mode) &&
is_git_directory(used_path)))) {

and "git diff --word-diff-regex=." shows

                        if (![-acces-]s{+tat+}(used_path, [-F-]{+&st) &&+}
{+                          (S+}_[-OK-]{+ISREG(st.st_mode) ||+}
{+                          (S_ISDIR(st.st_mode) &&
is_git_directory(used_path))+})) {



-- 
Piotr Krukowiecki

```

## Piotr Krukowiecki, 2012-03-19 17:06

Subject: Re: A better git diff --word-diff (--word-diff-regex) ?
Message-ID: <CAA01Cso5z9oT_MyFmGCJ0aV7EXb11k8zK4bJ9XBBLT3Yx_zpdw@mail.gmail.com>
URL: https://gitlist.dev/e/CAA01Cso5z9oT_MyFmGCJ0aV7EXb11k8zK4bJ9XBBLT3Yx_zpdw%40mail.gmail.com
In-Reply-To: <87ipi0vs0q.fsf@thomas.inf.ethz.ch>

```
On Mon, Mar 19, 2012 at 10:50 AM, Thomas Rast <trast@student.ethz.ch> wrote:
> Piotr Krukowiecki <piotr.krukowiecki@gmail.com> writes:
>
>> is there a way to configure --word-diff to be a more programming
>> language friendly? For example if I add one parameter to a function
>> declaration, I'd like to see only the addition of the parameter as the
>> change. But currently it shows much more.
>
> Umm, what's wrong with
>
>  echo '*.cpp diff=cpp' >>.git/info/attributes
>
> Ok, the funcname patterns aren't so good, but the word regex is designed
> to "tokenize" as far as that is feasible.

Thanks, that's very good! I've missed it reading the git-diff man page.

-- 
Piotr Krukowiecki

```
