dandavison / delta

A syntax-highlighting pager for git, diff, grep, and blame output
https://dandavison.github.io/delta/
MIT License
21.34k stars 359 forks source link

allow to completely omit zero ("same") lines (like `diff -U0` would do) #1644

Open calestyo opened 4 months ago

calestyo commented 4 months ago

Discussed in https://github.com/dandavison/delta/discussions/1620

Originally posted by **calestyo** February 8, 2024 Hey. I found no way to to disable the "surrounding" unmodified lines. `omit` doesn’t seem to work with `--zero-style` and there doesn’t seem to be a counterpart to `diff`’s `-U0`. Is this somehow possible? Thanks, Chris.
dandavison commented 4 months ago

Hi Chris, ok I'm sorry to say something that sounds silly, but isn't the answer -U0?? As in git show -U0? Or is the issue that you want this when doing delta file_1 file_2?

calestyo commented 4 months ago

Hey Dan.

Oh yes, I was thinking about the delta file_1 file_2 case.

But your answer made me realise that I could at least get the behaviour via diff -U0 a b | delta.
Nevertheless, would be nicer if it would work straight from delta.

dandavison commented 4 months ago

Right, my feeling has always been that it would be a mess to try to add the various diff options (actually git diff options) into delta's command-line parsing. delta a b is actually[1] a shorthand for git diff --no-index a b (a rather little-known command that allows git diff to be used on any arbitrary pair of files) and so my stock answer here is to say "would you mind just using git diff --no-index a b ... | delta ?" and admitting that perhaps I should never have implemented the delta a b shorthand!

[1] of course, this may have started out true but is not quite true any longer... we implemented support for things like delta <(echo a) <(echo b) which is an improvement over

$ git diff --no-index <(echo a) <(echo b)
error: /dev/fd/11: unsupported file type
fatal: cannot hash /dev/fd/11
dandavison commented 4 months ago

To justify "a mess" -- it's that delta at heart is really a tool that takes in diff / grep / blame input and outputs unparseable stuff to look at. And it has a pretty large collection of options for doing that! So one hesitates before adding options for generating the diff output.

calestyo commented 4 months ago

Right, my feeling has always been that it would be a mess to try to add the various diff options (actually git diff options) into delta's command-line parsing.

One way would perhaps be to add a single option, that allows passing any options to the actually used diff backend, be it git diff (which probably then also uses diff) or as in my example above diff itself.
That way you could allow people to give options, but don't have to handle each of them manually in your parsing.

delta a b is actually[1] a shorthand for git diff --no-index a b

Out of curiosity: Also if git is not available? Or would it then use diff?

"would you mind just using git diff --no-index a b ... | delta ?"

Well I would probably do so, if the above idea isn't an alternative for you either. ;-) It does however make life at least a tin bit more complicated in usage, as one needs (at least in scripting) to check diff’s exit status, which would be lost because of he pipe.
If delta would handle things internally (and does proper error handling), that could be avoided.

and admitting that perhaps I should never have implemented the delta a b shorthand!

I personally rather like the idea that delta is also standalone and not fully tied to git. Especially as it can also be used with diff/grep, as you said above.

Thanks, Chris.

dandavison commented 4 months ago

One way would perhaps be to add a single option, that allows passing any options to the actually used diff backend

OK I think you're right, that seems to makes sense. Any interest in implementing? I have to admit I am low on spare programming time currently due to day job. (But trying to at least keep up with the nice PRs and issue suggestions that come in).

if git is not available? Or would it then use diff?

Actually no, not currently, but that would be an easy fix to make I think:

https://github.com/dandavison/delta/blob/dcae5bcc2428d1fb6f5ff7b9cddd7f268d9a3735/src/subcommands/diff.rs#L26-L30

dandavison commented 1 month ago

One way would perhaps be to add a single option, that allows passing any options to the actually used diff backend

Finally got around to implementing that at https://github.com/dandavison/delta/pull/1697

calestyo commented 1 month ago

Thanks :-)