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.
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:
Sudo apt-get install colordiff
brew install colordiff
ou port install colordiff
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.
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:
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:
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.
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
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.
en couleur, au niveau du mot diff
sortie
Voici ce que vous pouvez faire avec le script ci-dessous et 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
(Crédit à réponse de @ retracile pour la mise en évidence de la sed
)
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:
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
É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:
Exemple tiré de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
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