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.
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
lubport install colordiff
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
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ść.
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:
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:
- użycie 'diff' (lub czegokolwiek innego) do uzyskania różnic na poziomie znaków między plikami tekstowymi
- https://unix.stackexchange.com/questions/11128/diff-within-a-line
- https://superuser.com/questions/496415/using-diff-on-a-long-one-line-file
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:
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.
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ą.
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
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 :
#!/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)
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ć.
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:
Przykład z https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
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:
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
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
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
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
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.
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
@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
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