Kiedy mam różnicę, jak mogę ją pokolorować, aby dobrze wyglądała? Chcę tego w wierszu poleceń, więc proszę nie rozwiązywać GUI.
unix
command-line
colors
diff
Daniel Kullmann
źródło
źródło
Odpowiedzi:
Strony
diff
podręcznika dla sugerują, że nie ma rozwiązania dla samego kolorowania. Proszę rozważyć użyciecolordiff
. Jest to opakowanie,diff
które wytwarza takie same dane wyjściowe jak diff, z tym wyjątkiem, że zwiększa dane wyjściowe za pomocą kolorowego podświetlania składni w celu zwiększenia czytelności:Lub tylko:
Instalacja:
sudo apt-get install colordiff
brew install colordiff
lubport install colordiff
źródło
less -R
, która wyświetla poprawnie sekwencje specjalne dla kolorów.-y
opcja włączenia) ☹vimdiff
Sugestia poniżej prawdopodobnie lepszym sposobemcolordiff
działa dobrze dlasvn diff | colordiff
(tj. w sytuacjach, w których masz tylko różnicę, a nie dwa różnicowane pliki).-y
wsparcie obok siebie ( ).Użyj Vima :
Lub jeszcze lepiej, VimDiff (lub
vim -d
, który jest krótszy do pisania) pokaże różnice między dwoma, trzema lub czterema plikami obok siebie.Przykłady:
źródło
ctrl-c
ictrl-x
mają inne zastosowania w Vimie.ctrl-q
jest przechwytywany przez wiele terminali. Zobacz Pisanie i rzucanie, aby znaleźć sposób, który najlepiej odpowiada Twoim potrzebom.zsh
? Nie rozpoznaję=(...)
konstrukcji. Po drugie, miałemdiff -ur a b
na myśli.=(...)
jest zastępowane nazwą pliku zawierającego dane wyjściowe.Właściwie wydaje się, że istnieje jeszcze jedna opcja (którą zauważyłem niedawno, gdy napotkałem wyżej opisany problem):
Jeśli masz Git w pobliżu (z którego już i tak możesz już korzystać), będziesz mógł użyć go do porównania, nawet jeśli same pliki nie są pod kontrolą wersji. Jeśli opcja ta nie jest domyślnie włączona, włączenie obsługi kolorów wydaje się znacznie łatwiejsze niż niektóre z wcześniej wspomnianych obejść.
źródło
git diff <(xxd file1) <(xxd filed)
nie działa.git help diff
. Więc jeśli twój git diff jest pusty, wypróbuj tocd
, gdzie jesteś.git config color.diff auto
git diff --no-index
do porównania dwóch plików.diff --color
opcja została dodana do GNU diffutils 3.4 (2016-08-08)To jest domyślne
diff
implementacja większości dystrybucji, która wkrótce ją otrzyma.Ubuntu 18.04 ma wersję
diffutils
3.6 i dlatego ją posiada.W wersji 3.5 wygląda to tak:
Przetestowany:
Najwyraźniej dodano w zatwierdzeniu c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (marzec 2015).
Różnica na poziomie słowa
Jak
diff-highlight
. Wygląda na to, że nie jest możliwe, żądanie funkcji: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.htmlPowiązane wątki:
ydiff
robi to, patrz poniżej.ydiff
diff poziom słowa obok siebiehttps://github.com/ymattw/ydiff
Czy to jest nirwana?
Wynik:
Jeśli linie są zbyt wąskie (domyślnie 80 kolumn), dopasuj do ekranu za pomocą:
Zawartość plików testowych:
za
b
ydiff
Integracja z Gitydiff
integruje się z Git bez wymaganej konfiguracji.Z repozytorium git zamiast
git diff
możesz zrobić tylko:i zamiast
git log
:Zobacz także: Jak mogę uzyskać diff side-by-side, gdy robię „git diff”?
Testowane na Ubuntu 16.04, git 2.18.0, ydiff 1.1.
źródło
There is no word-highlighting, yet
- jakieś aktualizacje? Właśnie do tego doszedłem do tego pytania (chcęgrep --color
wynik wyjściowy diff).git diff --color
działa również. Przydatne podczas pracy nad ssh.diff --color=always | less -R
A w przypadkach, gdy a
yum install colordiff
lub anapt-get install colordiff
nie jest opcją z powodu jakiegoś szalonego ograniczenia poza twoją bezpośrednią kontrolą lub po prostu oszalałeś , możesz ponownie wymyślić koło z linią sed:Rzuć to w skrypcie powłoki i potokuj przez nią ujednolicone wyjście różnicowe .
Sprawia, że znaczniki przystojniaków stają się niebieskie, a nowe / stare nazwy plików i dodane / usunięte linie odpowiednio na zielonym i czerwonym tle. 1 I sprawi, że końcowe zmiany spacji 2 będą bardziej widoczne niż kolordiff może.
1 Nawiasem mówiąc, powodem podświetlenia nazw plików tak samo, jak zmodyfikowanych linii jest to, że prawidłowe rozróżnienie między nazwami plików a zmodyfikowanymi liniami wymaga odpowiedniego 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 staje się trywialny. To powiedziawszy, istnieje kilka interesujących subtelności .
2 Ale nie końcowe tabulatory. Najwyraźniej zakładki nie mają ustawionego tła, przynajmniej w moim Xtermie. To sprawia, że zmiany tabulacji i spacji nieco się wyróżniają.
źródło
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(ale spodziewam się, że jest lepszy sposób).Możesz zmienić konfigurację subversion, aby używać colordiff
~ / .subversion / config.diff
przez: https://gist.github.com/westonruter/846524
źródło
Kolorowe wyjście na poziomie słowa
diff
Oto, co możesz zrobić z poniższym skryptem i wyróżnieniem różnic :
( Podziękowania dla odpowiedzi @ retracile dla
sed
wyróżnienia)źródło
vim
użyj wtyczki, np . Diffchar .Używam
grc
(Generic Colouriser), który pozwala pokolorować wyjście wielu poleceń, w tymdiff
.Jest to skrypt Pythona, który można zawinąć wokół dowolnego polecenia. Zamiast więc wywoływać
diff file1 file2
, można wywoływać,grc diff file1 file2
aby zobaczyć kolorowe wyjście. Mam aliasdiff
, abygrc diff
ułatwić.źródło
fork()
wywołań, chociaż prawdopodobnie działa z WSL.Oto kolejne rozwiązanie, które wywołuje
sed
wstawić odpowiednie sekwencje ANSI ewakuacyjnych na kolory, aby pokazać+
,-
i@
linii w kolorze czerwonym, zielonym i błękitnym, odpowiednio.W przeciwieństwie do innych rozwiązań tego pytania, to rozwiązanie nie określa wprost sekwencji ucieczki ANSI. Zamiast tego wywołuje polecenia
tput setaf
itput sgr0
, aby wygenerować sekwencje specjalne ANSI, aby odpowiednio ustawić odpowiedni kolor i zresetować atrybuty terminala.Aby zobaczyć dostępne kolory dla każdego argumentu
tput setaf
, użyj tego polecenia:Oto jak wygląda wyjście:
Oto dowód, że polecenia
tput setaf
itput sgr0
generują odpowiednie sekwencje specjalne ANSI:źródło
Ponieważ
wdiff
akceptuje argumenty określające ciąg na początku i na końcu zarówno wstawiania, jak i usuwania, możesz użyć sekwencji kolorów ANSI jako tych ciągów: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
źródło
colordiff
teraz (1.0.16) rozumiewdiff
, więc można też po prostu rury:wdiff -n f1 f2 | colordiff
.wdiff
powinny zostać połączone w diffutils ...Sugerowałbym, abyś zrobił coś tak fantazyjnego . Używam go podczas pracy i na pewno wydaje się świetny na teraz. Dostarczany jest z wieloma opcjami i naprawdę łatwo skonfigurować dyfuzję tak, jak chcesz.
Możesz go zainstalować:
lub na Macu:
Następnie możesz wyróżnić swoje różnice w następujący sposób:
źródło
Z poleceniem nietoperza :
źródło
W najnowszych wersjach git na Ubuntu możesz włączyć wyróżnianie różnic za pomocą:
A następnie dodając to do
.gitconfig
:Możliwe jest, że skrypt znajduje się gdzie indziej w innych dystrybucjach, możesz
locate diff-highlight
dowiedzieć się gdzie.źródło
Różnica kolorów na poziomie znaków: zainstaluj ccdiff
źródło