Brian Lovin
/
Hacker News
Daily Digest email

Get the top HN stories in your inbox every day.

SushiHippie

Delta has been one of those set and forget things, it's been a while since I've seen 'bare' git grep/diff/blame output, I also use it all the time for normal diffs (outside of git repos), but TIL that it also works with ripgrep [0]

As someone else already mentioned there is also bat[1], which was also set and forget, I aliased cat to bat and have a seperate alias vcat for 'vanilla cat' /usr/bin/cat

[0] https://dandavison.github.io/delta/grep.html

[1] https://github.com/sharkdp/bat

desperatecuban

You can use \cat to prevent alias expansion.

wlonkly

Or 'command cat', which is a little less convenient but will also handle the case where "cat" is a function, not an alias.

(In bash at least. Not sure about newfangled shells!)

drdude

Neat! thanks for sharing. Few times I needed that but I had to go hunting down the full path.

aroch

I have ‘ccat’ aliases to the original cat binary

SushiHippie

That's even better, thank you!

ossusermivami

or you can do =cat on zsh

somat

There was a good point made, that has stuck with me over the years. that our syntax highlighters are highlighting the wrong thing.

They should not be coloring the grammar, we are good at picking out grammar, they should be highlighting the symbols. each different variable and function name should be getting it's own color. that is, the goal is to make it quicker to distinguish different symbols, not that they are a symbol.

But this is much harder than stylizing the grammar so all our tooling sticks with the easy thing rather that the useful thing. Now, I am being a bit mean on grammar styling. It does help quite a bit but I would like to see a symbol matching engine in action to see if that really works.

Unfortunately I don't remember where I read the original post and am unable to attribute it correctly.

update: while trying to look it up I found this https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...

milliams

This is what KDevelop called Semantic Highghting (as opposed to Syntax Highlighting). I think it was there earlier than this, but the earliest post I can find describing it is from 2009: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...

sicariusnoctis

The author of that post wrote "difftastic", which is "a structural diff that understands syntax" using treesitter.

https://difftastic.wilfred.me.uk/

https://github.com/Wilfred/difftastic

aquariusDue

Totally agree, at first it looked alien to me but I've grown used to and prefer this way of highlighting. Personally I use color-identifiers-mode[0] for Emacs.

[0] https://github.com/ankurdave/color-identifiers-mode

tjoff

We are pretty good at picking out variable names too... Especially if the grammar itself is highlighted since we then know exactly where to look / where not to look.

I'm not convinced of the argument, but still a bit curious.

I sometimes highlight a variable to follow it and make sure I don't miss an instance of it, so that I totally get. But not sure we have enough colors and contrast to make sense to follow many variables without cluttering everything up. A compromise might be to manually color up to 3 or something variables.

... but the cases where that helps may be a sign that the code isn't very readable to begin with (helping with messy codebases is a proper usecase though!).

montroser

Not as fancy, but if you want halfway reasonable word-level diffs with just standard issue git, this is often good enough:

  git diff --color-words --word-diff-regex='\w+|.'

einpoklum

How do I enable this by default (in .gitconfig)?

Alifatisk

Try this

git config --global diff.colorWords true

git config --global diff.wordRegex '\w+|.'

CGamesPlay

Delta is great for what it does, but I consistently hit an issue where it truncates long lines. This post inspired me to check if the situation had changed... and it has! Now if you set `git config --global --replace-all delta.max-line-length 0`, it will no longer truncate lines. It's unclear to me why this is not the default. Discussion about the change is in https://github.com/dandavison/delta/pull/290.

BossingAround

> It's unclear to me why this is not the default

It's literally in the PR you mention:

syntax-highlighting very long lines (e.g. minified .js) will be very slow if they are not truncated

CGamesPlay

If you read the comments, you’ll find https://github.com/dandavison/delta/pull/1746 which adds the option I mentioned, which limits the length of syntax highlighting, but still has a rather low limit on maximum (unhighlighted) line length :)

atombender

Speaking of diffs, one thing that annoys me about Git's diff output is that is prints file paths like Unix diff traditionally does, starting with the two file names:

    --- a/some/path/to/file.c
    +++ b/some/path/to/file.c
I often cmd-click in iTerm to open a file in an editor, but this doesn't work here because of the a/ and b/ prefixes. Any way to make Git format the file name better? I don't even need two lines here.

Jakob

  git config --global diff.noprefix true
Checkout the manual for more prefix options.

atombender

Perfect, thank you.

undefined

[deleted]

dangsux

[dead]

kjuulh

I've been using a mix of delta and difftastic both are amazing. Difftastic especially for tree-sitter AST syntaxes, it is a bit slower, but AST aware diff is so nice.

Delta looks clean, and is super fast

wlonkly

Here's a handy delta trick for you, to turn the side-by-side feature on and off based on window size. bash here, other shells left as an exercise:

  function delta_sidebyside {
    if [[ COLUMNS -ge 120 ]]; then
      DELTA_FEATURES='side-by-side'
    else
      DELTA_FEATURES=''
    fi
  }
  trap delta_sidebyside WINCH

dbtablesorrows

You are probably missing a $ before COLUMNS and export before setting DELTA_FEATURES

wlonkly

Bash is funny with the -gt, -lt etc. operators and the [[ ]] builtin -- bash treats them as arithmetic operators like it does with math in $(( )), and so you provide them the variable name, not the value.

    $ TEST=3
    $ if [[ TEST -gt 2 ]]; then echo "honk"; fi
    honk
    $ TEST=1
    $ if [[ TEST -gt 2 ]]; then echo "honk"; fi
    $
That lets you do things like

    $ if [[ TEST*3 -gt 6 ]]; ...
without having to nest even more double parentheses.

You're correct about having to export DELTA_FEATURES at least once. (I export it outside of the function, but no harm in doing so whenever it's set -- but it's not required to re-export it when you change the value.) Thanks for catching that!

signal11

I use both delta and difftastic (difft), and cannot recommend them enough.

If you use the terminal at all, get them!

nine_k

Difftastic and Delta work not only in bare terminals. Both are supported by Magit in Emacs, both are also supported by Lazygit.

mbork_pl

What??? Do I have to set something in Magit for that to work?

That would be one of the coolest news in weeks!

nine_k

For delta, there's magit-delta in MELPA.

For difftastic, there is difftastic package in MELPA, see also https://github.com/pkryger/difftastic.el for instructions.

joeevans1000

I second this question.

kayson

I've been using difftastic for a while. How do you use both together?

mfrw

I have `delta` as my default and for difft, I use the following:

`env GIT_EXTERNAL_DIFF=difft git log -p --ext-diff`

Hope it helps :)

matijs

I have this set as an alias:

difft = -c diff.external=difft diff

I may add a similar alias for delta

0fflineuser

I am also curious.

joeevans1000

... and this one.

commandersaki

I want to like this having used regular `git diff` tool with colours, but this is just too busy.

mookid11

you might like diffr (https://github.com/mookid/diffr) (disclaimer: my project)

computerfriend

I was about to make the same recommendation! I tried delta and difftastic and both were too much for me, so I've been using diffr as my git diff program for the past few years. It's delightful, thanks for making it.

samatman

Very nice, I've been looking for something like this since completing a port of DiffMatchPatch. I'll going to give it a spin right away, thanks for sharing your hard work!

As a bit of feedback, you might wish to put a section showing how to make a git alias for diffr, to complement the section on how to install it as the default. I know how to do this already, because I use delta and dft depending on what I need to see, but it would be useful to others to have a copy-paste solution handy.

waynesonfire

had the same impression. never really found bare git diff to be a problem.

dr_kretyn

The thing that prevents me from using delta is lack of "system" theme detection. Can't set it up and forget and mismatching theme with shell makes it really difficult to read.

Myrmornis

Hi, delta now automatically detects whether the terminal background is light or dark and selects a theme accordingly. (This is due to the nice work of contributor bash: https://github.com/bash/terminal-colorsaurus)

godelski

On a not-so-completely unrelated note, if you didn't know on GitHub READMEs you can do things like

  ![img-text](assets//myimg_dark.png#gh-dark-mode-only)
  ![img-text](assets/myimg_light.png#gh-light-mode-only)
To automatically display the light or dark version of images depending on their gh theme (works html style too)

I'm also fond of

  <p align="center">
     ....
  </p>
Which I notice you do :), but did you know you could also do it to tables and center the caption?

  <table align="center">
    <tr>
      <td>
        <img width=800px src="https://user-images.githubusercontent.com/52205/87230973-412eb900-c381-11ea-8aec-cc200290bd1b.png" alt="image" />
        <br>
        <p align="center"><sub>delta with <code>side-by-side</code> and <code>line-numbers</code> activated</sub></p>
      </td>
    </tr>
  </table>
This isn't really a critique or anything, it is that I appreciate that you took the time to make things look pretty and it seems like you'd be interested in this kind of stuff

Also to others, this even works in issues and elsewhere. I find this stuff really helpful when writing issues

Myrmornis

Thanks! https://github.com/dandavison/delta/pull/1893

> To automatically display the light or dark version of images depending on their gh theme

Ah, good call. That could be a nice improvement -- creating light and dark versions of the screenshots with switching as you describe.

WD-42

It will use whatever `bat` theme is set. Bat itself doesn't do system theme detection, but it's easy enough to do in a script - I have one that gets called when my system theme changes where I set themes for various programs. Looks like this for dark mode:

    #!/usr/bin/fish
    gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
    fish_config theme choose "ayu Mirage"
    yes | fish_config theme save
    echo "--theme=OneHalfDark" > ~/.config/bat/config
    kitten themes --reload-in=all "Ayu Mirage"
The bat config change will make delta respect my "system" theme.

_def

I saw this recently and thought "great!" and tried it out, thinking I would love it. But somehow I actually prefer the way git already does it, even if it seems inferior to me. Maybe I'd just have to get used to it?

tionis

Same for me. I don't know, delta seems more like a chaos I can't make sense of than default git diffs

Daily Digest email

Get the top HN stories in your inbox every day.

Delta: A syntax-highlighting pager for Git, diff, grep, and blame output - Hacker News