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.
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.
Odpowiedzi:
Strony diffpodręcznika dla sugerują, że nie ma rozwiązania dla samego kolorowania. Proszę rozważyć użycie colordiff. Jest to opakowanie, diffktó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:
diff old new | colordiff
Lub tylko:
colordiff old new
Instalacja:
sudo apt-get install colordiffbrew install colordifflubport install colordiffless -R, która wyświetla poprawnie sekwencje specjalne dla kolorów.
-yopcja włączenia) ☹ vimdiffSugestia poniżej prawdopodobnie lepszym sposobem
colordiffdziała dobrze dla svn diff | colordiff(tj. w sytuacjach, w których masz tylko różnicę, a nie dwa różnicowane pliki).
-ywsparcie obok siebie ( ).
Użyj Vima :
diff /path/to/a /path/to/b | vim -R -
Lub jeszcze lepiej, VimDiff (lubvim -d , który jest krótszy do pisania) pokaże różnice między dwoma, trzema lub czterema plikami obok siebie.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
ctrl-ci ctrl-xmają inne zastosowania w Vimie. ctrl-qjest 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łem diff -ur a bna 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):
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 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ść.
git diff <(xxd file1) <(xxd filed)nie działa.
git help diff. Więc jeśli twój git diff jest pusty, wypróbuj to cd, gdzie jesteś.
git config color.diff auto
git diff --no-indexdo 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ę diffutils3.6 i dlatego ją posiada.
W wersji 3.5 wygląda to tak:
Przetestowany:
diff --color -u \
<(seq 6 | sed 's/$/ a/') \
<(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
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.html
Powiązane wątki:
ydiff robi to, patrz poniżej.
ydiff diff poziom słowa obok siebie
https://github.com/ymattw/ydiff
Czy to jest 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:
za
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 z Git
ydiff integruje się z Git bez wymaganej konfiguracji.
Z repozytorium git zamiast git diffmożesz zrobić tylko:
ydiff -s
i zamiast git log:
ydiff -ls
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.
There is no word-highlighting, yet- jakieś aktualizacje? Właśnie do tego doszedłem do tego pytania (chcę grep --colorwynik wyjściowy diff).
git diff --colordziała również. Przydatne podczas pracy nad ssh.
diff --color=always | less -R
A w przypadkach, gdy a yum install colordifflub an apt-get install colordiffnie 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:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
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ą.
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
### 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
Kolorowe wyjście na poziomie słowa diff
Oto, co możesz zrobić z poniższym skryptem i wyróżnieniem różnic :
#!/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 odpowiedzi @ retracile dla sedwyróżnienia)
Używam grc(Generic Colouriser), który pozwala pokolorować wyjście wielu poleceń, w tym diff.
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 file2aby zobaczyć kolorowe wyjście. Mam alias diff, aby grc diffułatwić.
fork()wywołań, chociaż prawdopodobnie działa z WSL.
Oto kolejne rozwiązanie, które wywołuje sedwstawić odpowiednie sekwencje ANSI ewakuacyjnych na kolory, aby pokazać +, -i @linii w kolorze czerwonym, zielonym i błękitnym, odpowiednio.
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 pytania, to rozwiązanie nie określa wprost sekwencji ucieczki ANSI. Zamiast tego wywołuje polecenia tput setafi tput 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:
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 setafi tput sgr0generują odpowiednie sekwencje specjalne 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
Ponieważ wdiffakceptuje 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:
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
colordiffteraz (1.0.16) rozumie wdiff, więc można też po prostu rury: wdiff -n f1 f2 | colordiff. wdiffpowinny 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ć:
sudo npm install -g diff-so-fancy
lub na Macu:
brew install diff-so-fancy
Następnie możesz wyróżnić swoje różnice w następujący sposób:
diff -u file1 file2 | diff-so-fancy
Z poleceniem nietoperza :
diff file1 file2 | bat -l diff
W najnowszych wersjach git na Ubuntu możesz włączyć wyróżnianie 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 dodając to do .gitconfig:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
Możliwe jest, że skrypt znajduje się gdzie indziej w innych dystrybucjach, możesz locate diff-highlightdowiedzieć się gdzie.