Wie kann ich eine Diff. so einfärben, dass sie gut aussieht?
Ich möchte es für die Kommandozeile, also bitte keine GUI-Lösungen.
Wie kann ich eine Diff. so einfärben, dass sie gut aussieht?
Ich möchte es für die Kommandozeile, also bitte keine GUI-Lösungen.
Man-Seiten für diff
keine Lösung für die Färbung aus sich selbst heraus vorschlagen. Bitte erwägen Sie die Verwendung von colordiff
. Es ist eine Umhüllung für diff
das die gleiche Ausgabe wie diff erzeugt, mit dem Unterschied, dass es die Ausgabe durch farbige Syntaxhervorhebung ergänzt, um die Lesbarkeit zu erhöhen:
diff old new | colordiff
oder einfach:
colordiff old new
Einbau:
sudo apt-get install colordiff
brew install colordiff
ou port install colordiff
Das habe ich gerade selbst entdeckt :-). Es kann in less eingefügt werden, indem man less -R
das die Escape-Sequenzen für Farben korrekt anzeigt.
Leider funktioniert dies nicht für die Side-by-Side-Ausgabe ( -y
Option zu aktivieren) Die vimdiff
untenstehender Vorschlag ist wahrscheinlich ein besserer Weg
@Jichao: Ich ziehe es vor, die Befehle zu lernen, anstatt sie mit Aliasen zu versehen. Auf diese Weise kann ich sie überall verwenden, auch wenn meine Dotfiles nicht verfügbar sind.
Vim -d hat den Vorteil, dass er sich die zuletzt geöffnete Position merkt, wenn die richtige vimrc-Einstellung verwendet wird. (Wie zum Beispiel これ .)
Es scheint noch eine weitere Möglichkeit zu geben (die ich erst vor kurzem entdeckt habe, als ich auf das oben beschriebene Problem stieß):
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
Wenn Sie Git zur Verfügung haben (was Sie vielleicht ohnehin schon tun), können Sie es zum Vergleich verwenden, auch wenn die Dateien selbst nicht unter Versionskontrolle stehen. Wenn dies bei Ihnen nicht standardmäßig aktiviert ist, scheint die Aktivierung der Farbunterstützung hier wesentlich einfacher zu sein als einige der zuvor erwähnten Workarounds.
Das ist nett, aber leider funktioniert es nicht, wenn die Eingänge Rohre sind. Zum Beispiel der Vergleich von Binärdateien über git diff <(xxd file1) <(xxd filed)
funktioniert nicht.
Seltsamerweise muss mindestens eine der Dateien "außerhalb des aktuellen Repositorys" liegen, wie es in git help diff
. Wenn Ihr Git-Diff also ins Leere läuft, versuchen Sie cd
von dort, wo du bist.
diff --color
Option (hinzugefügt zu GNU diffutils 3.4 am 2016-08-08)
Dies ist die Standardeinstellung diff
Implementierung auf den meisten Distributionen, die sie bald erhalten werden.
Ubuntu 18.04 (Bionic Beaver) hat diffutils
3.6 und hat ihn daher.
Bei 3.5 sieht es so aus:
Getestet mit:
diff --color -u \
<(seq 6 | sed 's/$/ a/') \
<(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
Anscheinend hinzugefügt in Commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (März 2015).
Unterschied auf Wortebene
Wie diff-highlight
. Es ist nicht möglich, es scheint, aber es ist eine Funktion Anfrage: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html
Verwandte Fragen:
ydiff
tut es aber. Siehe unten.
ydiff
Seite-an-Seite-Vergleich auf Wortebene
https://github.com/ymattw/ydiff
Ist das das Nirwana?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s
Das Ergebnis:
Wenn die Zeilen zu schmal sind (Standardwert 80 Spalten), passen Sie sie mit an den Bildschirm an:
diff -u a b | ydiff -w 0 -s
Inhalt der Testdateien:
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 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
ydiff
Git-Integration
ydiff
integriert sich in Git, ohne dass eine Konfiguration erforderlich ist.
Innerhalb eines Git-Repositorys können Sie anstelle von git diff
können Sie einfach tun:
ydiff -s
und anstelle von git log
:
ydiff -ls
Siehe auch: Wie kann ich eine Seite-an-Seite-Diff erhalten, wenn ich "git diff" ausführe?
Getestet am Ubuntu 16.04 (Xenial Xerus), Git 2.18.0 und ydiff 1.1.
In diesem Thread der Mailingliste: There is no word-highlighting, yet
- Gibt es Neuigkeiten? Dies ist, was ich kam zu dieser Frage für (Ich möchte grep --color
-ähnliche diff-Ausgabe).
@i336_ leider keine Updates, wenn ich welche bekomme, werde ich die Frage aktualisieren. Ping mich, wenn Sie etwas finden.
Und für die Fälle, in denen ein yum install colordiff
oder ein apt-get install colordiff
aufgrund einer irrsinnigen Einschränkung, die sich Ihrer unmittelbaren Kontrolle entzieht, nicht möglich ist, oder du bist einfach nur verrückt können Sie das Rad mit einer Zeile sed neu erfinden:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
Geben Sie das in ein Shell-Skript ein und leiten Sie Einheitsdiff Ausgabe durch sie.
Sie macht die Hunk-Markierungen blau und hebt neue/alte Dateinamen und hinzugefügte/entfernte Zeilen in grünem bzw. rotem Hintergrund hervor. 1 Und es wird ein Leerzeichen am Ende gemacht 2 Veränderungen leichter erkennbar als bei colordiff.
1 Der Grund für die Hervorhebung der Dateinamen und der geänderten Zeilen liegt übrigens darin, dass die korrekte Unterscheidung zwischen den Dateinamen und den geänderten Zeilen das korrekte Parsen des Diff-Formats erfordert, was mit einer Regex nicht zu bewerkstelligen ist. Die Hervorhebung der gleichen Zeilen ist visuell "gut genug" und macht das Problem trivial. Abgesehen davon gibt es einige interessante Feinheiten .
2 Aber nicht die hinteren Tabs. Anscheinend bekommen Tabs ihren Hintergrund nicht gesetzt, zumindest in meinem xterm . Der Wechsel zwischen Tabulator und Leerzeichen wird dadurch allerdings etwas deutlicher.
@Matt: Hier ist ein Brute-Force-Ansatz für einen Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(obwohl ich davon ausgehe, dass es einen besseren Weg gibt).
Hmm, es hat irgendwie funktioniert... gab den 3 Strichen zwischen den einzelnen Brocken einen rosa Hintergrund.
Manuell nicht lesbar, nicht pflegbar, ohne die Möglichkeit, z. B. die Farben leicht zu ändern.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
7 Stimmen
Ein bestimmtes Betriebssystem/Shell?
4 Stimmen
Versuchen Sie github.com/walles/riff . Als zusätzlicher Bonus wird hervorgehoben, welche Teile der Linien sich geändert haben.
0 Stimmen
Emacs macht großartige Farbunterschiede in einem Terminal; ist es das, was Sie mit nicht-GUI meinen? Siehe unix.stackexchange.com/a/613399/80268 .