Jak kolorować różnice w wierszu poleceń?

Kiedy mam diff, Jak mogę go pokolorować, aby wyglądał dobrze? Chcę go dla linii poleceń, więc proszę żadnych rozwiązań GUI.

Author: daniel kullmann, 2012-01-10

15 answers

Strony podręcznika dla diff nie sugerują żadnego rozwiązania dla koloryzacji od wewnątrz. Proszę rozważyć użycie colordiff. Jest to owijarka wokół diff, która produkuje takie same wyjście jak diff, z tym wyjątkiem, że rozszerza wyjście za pomocą kolorowego podświetlania składni w celu zwiększenia czytelności:

diff old new | colordiff

Lub po prostu:

colordiff old new

Instalacja:

  • Ubuntu/Debian: sudo apt-get install colordiff
  • OS X: brew install colordiff lub port install colordiff
 637
Author: kaji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 05:45:11

Użyj Vim :

diff /path/to/a /path/to/b | vim -R -

Lub jeszcze lepiej, VimDiff (lub vim -d, który jest krótszy do wpisania) pokaże różnice między dwoma, trzema lub czterema plikami obok siebie.

Przykłady:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
 341
Author: Johnsyweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Faktycznie wydaje się być jeszcze inna opcja (którą zauważyłem dopiero niedawno, gdy napotkałem problem opisany powyżej):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

Jeśli masz Gita w pobliżu (którego i tak możesz używać), będziesz mógł go użyć do porównania, nawet jeśli same pliki nie są pod kontrolą wersji. Jeśli domyślnie nie jest włączona, włączenie obsługi kolorów wydaje się znacznie łatwiejsze niż niektóre z wcześniej wymienionych obejść.

 181
Author: Lars Baehren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-17 19:25:11

diff --color opcja została dodana do GNU diffutils 3.4 (2016-08-08)

Jest to domyślna implementacja diff na większości dystrybucji, która wkrótce ją otrzyma.

Ubuntu 18.04 ma diffutils 3.6 i dlatego go ma.

Na 3.5 wygląda to tak:

Tutaj wpisz opis obrazka

Sprawdzone przez:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Najwyraźniej dodany w commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (marzec 2015).

Word-level diff

Jak diff-highlight. Wydaje się, że to niemożliwe, Prośba o funkcję: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Powiązane wątki:

ydiff czy to jednak, zobacz poniżej.

ydiff side-by-side Word level diff

Https://github.com/ymattw/ydiff

Czy to Nirwana?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Wynik:

Tutaj wpisz opis obrazka

Jeśli linie są zbyt wąskie (domyślnie 80 kolumn), Dopasuj do ekranu za pomocą:

diff -u a b | ydiff -w 0 -s

Zawartość plików testowych:

A

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

B

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff integracja Git

ydiff integruje się z Gitem bez żadnej konfiguracji wymagane.

Z repozytorium git, zamiast git diff, możesz zrobić po prostu:

ydiff -s

I zamiast git log:

ydiff -ls

Zobacz także: jak Mogę uzyskać side-by-side diff kiedy robię "Git diff"?

Testowane na Ubuntu 16.04, git 2.18.0, ydiff 1.1.

 110
Author: Ciro Santilli TRUMP BAN IS BAD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-06 09:10:11

W przypadku, gdy nie ma opcji z powodu jakiegoś szalonego ograniczenia, poza Twoją bezpośrednią kontrolą, lub po prostu czujesz się szalony, możesz ponownie wymyślić koło za pomocą linii sed:]}

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

Wrzuć to do skryptu powłoki i przepuśćunified diff przez niego.

Sprawia, że znaczniki hunk są niebieskie i podświetlają nowe / stare nazwy plików oraz dodają / usunęły linie na zielonym i czerwonym tle.1 i to sprawi, że trailing spacja2 zmiany łatwiej widoczne niż colordiff może.


1 nawiasem mówiąc, powodem podkreślenia nazw plików tak samo jak zmodyfikowane linie jest to, że poprawne rozróżnienie między nazwami plików i zmodyfikowanymi liniami wymaga poprawnego parsowania formatu diff, co nie jest czymś, z czym trzeba się zmierzyć za pomocą wyrażenia regularnego. Podkreślenie ich to samo działa" wystarczająco dobrze " wizualnie i sprawia, że problem jest trywialny. To powiedziawszy, są ciekawe subtelności .

2 ale nie zakładki końcowe. Najwyraźniej karty nie mają ustawionego tła, przynajmniej w moim xterm. To sprawia, że zmiany tabulacji vs spacji trochę się wyróżniają.

 70
Author: retracile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 22:08:04

Możesz zmienić konfigurację subversion, aby używać colordiff

~/.subversion/config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

Via: https://gist.github.com/westonruter/846524

 16
Author: Azd325,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 12:21:55

Kolorowe, słowo-poziom diff ouput

Oto co możesz zrobić z poniższym skryptem i diff-highlight :

Kolorowy zrzut ekranu diff

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

(podziękowania dla @retraile ' s answer za sed podświetlenie)

 15
Author: Tom Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-31 19:28:15

Używam grc (Generic Colouriser), który pozwala pokolorować wyjście wielu poleceń, w tym diff.

Jest to skrypt Pythona, który może być owinięty wokół dowolnego polecenia. Więc zamiast wywoływać diff file1 file2, wywołasz grc diff file1 file2, aby zobaczyć kolorowe wyjście. Aliased diff do grc diff aby ułatwić.

 11
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-10 08:56:51

Ponieważ wdiff akceptuje args określające ciąg znaków na początku i końcu zarówno wstawiania, jak i usuwania, można użyć sekwencji kolorów ANSI jako tych ciągów:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

Na przykład, jest to wynik porównania dwóch plików CSV:

diff wyjście plików CSV

Przykład z https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html

 7
Author: jcomeau_ictx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 07:04:30

Oto inne rozwiązanie, które wywołuje sed wstawianie odpowiednich sekwencji escape ANSI dla kolorów, aby pokazać +, -, i @ linie odpowiednio w kolorze czerwonym, zielonym i cyjanowym.

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

W przeciwieństwie do innych rozwiązań tego problemu, rozwiązanie to nie określa sekwencji escape ANSI wprost. Zamiast tego wywołuje polecenia tput setaf i tput sgr0, aby wygenerować sekwencje escape ANSI, aby ustawić odpowiedni kolor i zresetować atrybuty terminala, odpowiednio.

Aby zobaczyć dostępne kolory dla każdego argumentu tput setaf, użyj polecenia:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

Oto jak wygląda wyjście:

Tutaj wpisz opis obrazka

Oto dowód, że polecenia tput setaf i tput sgr0 generują odpowiednie sekwencje ucieczki ANSI:

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m
 6
Author: Susam Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-10 14:17:08

Sugerowałbym, żebyś spróbował. Używam go podczas mojej pracy i na pewno wydaje się świetny. Jest wyposażony w wiele opcji i naprawdę łatwo jest skonfigurować dyfuzory tak, jak chcesz.

Możesz go zainstalować przez:

sudo npm install -g diff-so-fancy

Lub na Macu:

brew install diff-so-fancy

Następnie możesz wyróżnić swoje diffy w następujący sposób:

diff -u file1 file2 | diff-so-fancy
 3
Author: Naveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-28 08:24:14

With bat command:

diff file1 file2 | bat -l diff
 2
Author: Weihang Jian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-11 09:15:41

Rozróżnianie kolorów na poziomie znaków: Install ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Wyjście ccdiff

 2
Author: apricot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-19 17:55:16

W najnowszych wersjach Gita na Ubuntu, możesz włączyć podświetlanie różnic za pomocą:

sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight

A następnie dodanie tego do twojego .gitconfig:

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

Możliwe, że skrypt znajduje się gdzieś indziej w innych dystrybucjach, możesz użyć locate diff-highlight, aby dowiedzieć się, gdzie.

 0
Author: naught101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-16 03:52:10

Dla mnie znalazłem kilka rozwiązań: jest to rozwiązanie robocze

Tutaj wpisz opis obrazka

     @echo off
    title a game for youtube 
explorer "https://thepythoncoding.blogspot.com/2020/11/how-to-echo-with-different-colors-in.html"
    SETLOCAL EnableDelayedExpansion
    for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
      set "DEL=%%a"
    )
    echo say the name of the colors, don't read
    
    call :ColorText 0a "blue"
    call :ColorText 0C "green"
    call :ColorText 0b "red"
    echo(
    call :ColorText 19 "yellow" 
    call :ColorText 2F "black"
    call :ColorText 4e "white"
    
    goto :Beginoffile
    
    :ColorText
    echo off
    <nul set /p ".=%DEL%" > "%~2"
    findstr /v /a:%1 /R "^$" "%~2" nul
    del "%~2" > nul 2>&1
    goto :eof
    
    :Beginoffile
 -1
Author: Kais Tounsi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-04 20:54:17