Jak obniżyć wyjście różnicowe w kolorze do mniejszej?

37

Używam git diff, który produkuje kolorowe wydruki. Jednak teraz uważam, że muszę do czegoś użyć zwykłego pliku różnicowego, a to daje dużo wydruków, które są trudne do odczytania z powodu braku kolorów. Jak sprawić, by diff dawał czytelne, kolorowe wydruki? Idealnie, gdy przesyłasz mniej, aby ułatwić przeglądanie dużych plików.

Benubird
źródło

Odpowiedzi:

32

diffnie można wyprowadzać kolorów, potrzebny jest inny program, na przykład colordiffdo tego. Kolory w terminalu są drukowane za pomocą kodów ucieczkowych ANSI, które mniej nie interpretuje domyślnie. Aby lesspoprawnie pokazać kolory, potrzebujesz przełącznika: -ra nawet lepiej -R:

colordiff -- "$file1" "$file2" | less -R

Od man less:

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI  "color"  escape  sequences  are
          output in "raw" form.  Unlike -r, the screen appearance
          is maintained correctly in most  cases.   ANSI  "color"
          escape sequences are sequences of the form:

               ESC [ ... m

          where  the  "..."  is  zero or more color specification
          characters For the purpose of keeping track  of  screen
          appearance,  ANSI color escape sequences are assumed to
          not move the cursor.  You  can  make  less  think  that
          characters  other  than  "m"  can end ANSI color escape
          sequences by setting the environment  variable  LESSAN‐
          SIENDCHARS  to  the  list of characters which can end a
          color escape sequence.  And you  can  make  less  think
          that characters other than the standard ones may appear
          between the ESC and the m by  setting  the  environment
          variable  LESSANSIMIDCHARS  to  the  list of characters
          which can appear.

Możesz też użyć tej opcji, morektóra domyślnie wyświetla kolory poprawnie.


Jeśli nie możesz zainstalować programów zewnętrznych, powinieneś być w stanie uzyskać to samo wyjście, stosując bardziej ręczne podejście:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
terdon
źródło
1
A jeśli ktoś chce zobaczyć procent wyświetlanych danych, musi użyć less -RM +Gg: superuser.com/questions/64972/…
baptx
13

Inne odpowiedzi tutaj mogą być nieaktualne. Od coreutils 3.5 diffmoże rzeczywiście generować kolorowe wydruki, które są domyślnie wyłączone, gdy standardowe wyjście nie jest konsolą.

Ze strony podręcznika:

--color[=WHEN]
pokoloruj wyjście; WHENmoże być never, alwayslub auto(domyślne)

Aby wymusić wyświetlanie kolorów, gdy standardowe wyjście jest potokiem, diff --color=always -- "$file1" "$file2" | less -Rpowinno działać.

Kshitiz Sharma
źródło
Możesz także dołączyć alias diff='diff --color=always'do pliku .bashrclub .zshrc.
jftuga
1
Tak. Używamalias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma
Używam alias diff='/usr/bin/diff --color=always 'i alias less='/usr/bin/less -r 'choć diff jest początkowo kolorowy na pierwszych stronach mniejszych, ale na długich różnicach czasami wraca do mono. Może to dotyczyć skoków, które wyraźnie nie wpłynęłyby na różnicę, ponieważ jego wynik jest generowany tylko raz i nie musi skakać, ale w jakiś sposób traci kolory.
NeilG
8

Aby zmienić kolor rury na mniejszy:

diff $file1 $file2 | colordiff | less -r

Aby uczynić go bardziej czytelnym, ograniczając go do jednego ekranu:

diff -uw $file1 $file2 | colordiff | less -r

I, aby mniej wyświetlać się, jeśli zawartość ma tylko jeden ekran:

diff -uw $file1 $file2 | tee /dev/stderr | colordiff | less -r -F

-F powoduje, że less zamyka się natychmiast, jeśli jest mniej niż jeden ekran z treścią, rura do stderr jest taka, że ​​gdy mniej zamyka, tracisz wyjście - przez potokowanie do stderr, uzyskuje wyjście, nawet jeśli less nie wyświetla się.

Alternatywnym (i moim zdaniem lepszym) sposobem jest po prostu użycie opcji -X, aby uniknąć mniejszego czyszczenia ekranu:

diff -uw $file1 $file2 | colordiff | less -r -X -F

Działa to dla mnie dobrze, ale może być specyficzne dla bash. colordiff nie jest wbudowany, ale można go łatwo zainstalować.

Benubird
źródło
2
Jedyne polecenie, jakiego potrzebuje, toless -r
sendmoreinfo