web-dev-qa-db-fra.com

Comment colorier les diff en ligne de commande?

Quand j'ai un diff, comment puis-je le coloriser pour qu'il soit beau? Je le veux pour la ligne de commande, donc s'il vous plaît pas de solutions d'interface graphique.

459
daniel kullmann

Les pages de manuel relatives à diff ne suggèrent aucune solution de colorisation de l'intérieur. Pensez à utiliser colordiff. C'est un wrapper autour de diff qui produit le même résultat que diff, sauf qu'il augmente le résultat en utilisant une coloration syntaxique colorée pour améliorer la lisibilité:

diff old new | colordiff

ou juste:

colordiff old new

Installation:

  • Ubuntu/Debian: Sudo apt-get install colordiff
  • OS X: brew install colordiff ou port install colordiff
571
kaji

Utilisez Vim :

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

Ou mieux encore, VimDiff (ou vim -d, qui est plus court au type) affichera les différences entre deux, trois ou quatre fichiers côte à côte.

Exemples:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4
321
Johnsyweb

En fait, il semble y avoir encore une autre option (que je n’avais remarquée que récemment, lorsque je rencontrais le problème décrit ci-dessus):

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

Si vous avez Git (que vous utilisez déjà de toute façon), vous pourrez l'utiliser à des fins de comparaison, même si les fichiers eux-mêmes ne sont pas sous contrôle de version. S'il n'est pas activé par défaut pour vous, l'activation de la prise en charge des couleurs semble être beaucoup plus simple que certaines des solutions de contournement mentionnées précédemment.

163
Lars Baehren

L'option diff --color a été ajoutée à GNU diffutils 3.4 (2016-08-08)

Ceci est l'implémentation par défaut de diff sur la plupart des distributions, qui l'obtiendront bientôt.

Ubuntu 18.04 a diffutils 3.6 et l’a donc.

Sur 3.5 cela ressemble à ceci:

enter image description here

Testé:

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

Apparemment ajouté au commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (mars 2015).

Diffère au niveau des mots

Comme diff-highlight. Impossible, semble-t-il, demande de fonctionnalité: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

Fils liés:

ydiff le fait cependant, voir ci-dessous.

ydiff côte à côte, diff de niveau de mot

https://github.com/ymattw/ydiff

Est-ce Nirvana?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Résultat:

enter image description here

Si les lignes sont trop étroites (80 colonnes par défaut), ajustez l'écran avec:

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

Contenu des fichiers de test:

une

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 Intégration de Git

ydiff s'intègre à Git sans qu'aucune configuration ne soit requise.

Depuis un dépôt git, au lieu de git diff, vous pouvez simplement faire:

ydiff -s

et au lieu de git log:

ydiff -ls

Voir aussi: Comment puis-je obtenir un diff côte à côte quand je fais "git diff"?

Testé sur Ubuntu 16.04, git 2.18.0, ydiff 1.1.

Et pour les occasions où un yum install colordiff ou un apt-get install colordiff n'est pas une option en raison d'une contrainte insensée échappant à votre contrôle immédiat ou que vous vous sentez simplement fou , vous pouvez réinventer la roue avec une ligne de sed:

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

Jetez cela dans un script Shell et faites passer unified diff à travers lui.

Il rend les marqueurs de morceaux bleus et met en surbrillance les nouveaux/anciens noms de fichiers et les lignes ajoutées/supprimées en arrière-plan vert et rouge, respectivement.1 Et cela fera de la fuite2 changements plus apparents que colordiff ne le peut.


1 Incidemment, la raison pour mettre les noms de fichiers en surbrillance de la même manière que les lignes modifiées est que pour différencier correctement les noms de fichiers des lignes modifiées, il est nécessaire d'analyser correctement le format diff, ce qui n'est pas une tâche à entreprendre avec une regex. Les mettre en évidence les mêmes œuvres "assez bien" visuellement et rend le problème trivial. Cela dit, il y a quelques subtilités intéressantes .

2 Mais pas les onglets suivants. Apparemment, les onglets ne prennent pas leur fond, du moins dans mon xterm. Cela rend les modifications de tabulation par rapport à l’espace un peu différentes.

68
retracile

Vous pouvez changer la configuration de Subversion pour utiliser 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
Azd325

J'utilise grc (Générateur de colorants générique), ce qui vous permet de colorer le résultat d'un certain nombre de commandes, dont diff.

C'est un script python qui peut être enroulé autour de n'importe quelle commande. Ainsi, au lieu d’invoquer diff file1 file2, vous devez appeler grc diff file1 file2 pour afficher les sorties en couleur. J'ai aliasé diff en grc diff pour le rendre plus facile.

10
dogbane

en couleur, au niveau du mot diff sortie

Voici ce que vous pouvez faire avec le script ci-dessous et diff-highlight :

Coloured diff screenshot

#!/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

(Crédit à réponse de @ retracile pour la mise en évidence de la sed)

10
Tom Hale

Voici une autre solution qui appelle sed pour insérer les séquences d'échappement ANSI appropriées pour les couleurs afin d'afficher les lignes +, - et @ en rouge, vert et cyan. respectivement.

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

Contrairement aux autres solutions à cette question, cette solution n'énonce pas explicitement les séquences d'échappement ANSI. Au lieu de cela, il appelle les commandes tput setaf et tput sgr0 pour générer les séquences d'échappement ANSI afin de définir une couleur appropriée et de réinitialiser les attributs du terminal, respectivement.

Pour voir les couleurs disponibles pour chaque argument de tput setaf, utilisez cette commande:

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

Voici à quoi ressemble la sortie:

enter image description here

Voici la preuve que les commandes tput setaf et tput sgr0 génèrent les séquences d'échappement ANSI appropriées:

$ 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
5
Susam Pal

Étant donné que wdiff accepte les arguments spécifiant la chaîne au début et à la fin des insertions et des suppressions, vous pouvez utiliser des séquences de couleurs ANSI comme chaînes:

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

Par exemple, voici le résultat de la comparaison de deux fichiers CSV:

diff output of CSV files

Exemple tiré de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html

5
jcomeau_ictx

Je vous conseillerais d'essayer diff-so-fantaisie . Je l'utilise pendant mon travail et ça me semble génial à partir de maintenant. Il contient de nombreuses options et il est très facile de configurer vos diffs comme vous le souhaitez.

Vous pouvez l'installer par:

Sudo npm install -g diff-so-fancy
1
Naveen