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 GUI.
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 GUI.
Réponses:
Les pages de diff
manuel ne proposent aucune solution pour la colorisation de l'intérieur. Veuillez envisager d'utiliser colordiff
. C'est un wrapper diff
qui produit la même sortie que diff, sauf qu'il augmente la sortie en utilisant la coloration syntaxique pour augmenter la lisibilité:
diff old new | colordiff
ou juste:
colordiff old new
Installation:
sudo apt-get install colordiff
brew install colordiff
ouport install colordiff
less -R
, qui affiche correctement les séquences d'échappement des couleurs.
-y
option à activer) ☹ La vimdiff
suggestion ci-dessous est probablement une meilleure façon
colordiff
fonctionne bien pour svn diff | colordiff
(c'est-à-dire dans les situations où vous n'avez que le diff, pas les deux fichiers étant diffed).
-y
support côte à côte ( ).
Utilisez Vim :
diff /path/to/a /path/to/b | vim -R -
Ou mieux encore, VimDiff (ou vim -d
, qui est plus court à taper) affichera les différences entre deux, trois ou quatre fichiers côte à côte.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
ctrl-c
et ctrl-x
avoir d'autres utilisations dans Vim. ctrl-q
est capturé par de nombreux terminaux. Voir Écrire et quitter pour trouver la manière qui convient le mieux à vos besoins.
zsh
? Je ne reconnais pas la =(...)
construction. Deuxièmement, j'avais diff -ur a b
à l'esprit.
=(...)
est remplacée par le nom d'un fichier contenant sa sortie.
En fait, il semble y avoir encore une autre option (que je n'ai remarquée que récemment, lors de l'exécution du 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 disposez de Git (que vous utilisez peut-être 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é pour vous par défaut, l'activation de la prise en charge des couleurs ici semble être beaucoup plus facile que certaines des solutions de contournement mentionnées précédemment.
git diff <(xxd file1) <(xxd filed)
ne fonctionne pas.
git help diff
. Donc, si votre diff git est vide, essayez de cd
sortir d'où vous êtes.
git config color.diff auto
git diff --no-index
pour comparer deux fichiers.
diff --color
option a été ajoutée à GNU diffutils 3.4 (2016-08-08)
Il s'agit de l' diff
implémentation par défaut de la plupart des distributions, qui sera bientôt disponible.
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é dans la validation c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (mars 2015).
Différence au niveau du mot
Comme diff-highlight
. Pas possible, semble-t-il, demande de fonctionnalité: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html
Sujets associés:
ydiff
le fait cependant, voir ci-dessous.
ydiff
différence de niveau de mot côte à côte
https://github.com/ymattw/ydiff
Est-ce le 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 Git
ydiff
s'intègre à Git sans aucune configuration requise.
De l'intérieur d'un référentiel git, au lieu de git diff
, vous pouvez faire simplement:
ydiff -s
et au lieu de git log
:
ydiff -ls
Voir aussi: Comment puis-je obtenir un diff côte à côte lorsque je fais "git diff"?
Testé sur Ubuntu 16.04, git 2.18.0, ydiff 1.1.
There is no word-highlighting, yet
- des mises à jour? C'est pour cela que je suis venu à cette question (je veux une grep --color
sortie de type diff).
git diff --color
fonctionne aussi. Utile lorsque vous travaillez sur ssh.
diff --color=always | less -R
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 hors de votre contrôle immédiat, ou si vous vous sentez juste 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 canalisez une sortie diff unifiée à travers lui.
Il rend les marqueurs de morceau bleus et met en évidence les nouveaux / anciens noms de fichiers et les lignes ajoutées / supprimées en arrière-plan vert et rouge, respectivement. 1 Et cela rendra les changements d' espace de fuite 2 plus visibles que ne peut le faire Colordiff.
1 Soit dit en passant, la raison pour laquelle les noms de fichiers sont mis en évidence de la même manière que les lignes modifiées est que pour différencier correctement les noms de fichiers et les lignes modifiées, il faut analyser correctement le format diff, ce qui n'est pas quelque chose à résoudre avec une expression régulière. Les mettre en évidence les mêmes fonctionne "assez bien" visuellement et rend le problème trivial. Cela dit, il y a quelques subtilités intéressantes .
2 Mais pas les onglets de fin. Apparemment, les onglets ne reçoivent pas leur arrière-plan, du moins dans mon xterm. Cela fait ressortir un peu les changements de tabulation vs d'espace.
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(même si je m'attends à ce qu'il y ait une meilleure façon).
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
Couleur, mot-niveau diff
ouput
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 à la réponse de @ retracile pour la sed
mise en évidence)
J'utilise grc
(Generic Colouriser), qui vous permet de colorer la sortie d'un certain nombre de commandes dont diff
.
Il s'agit d'un script python qui peut être enroulé autour de n'importe quelle commande. Ainsi, au lieu d'invoquer diff file1 file2
, vous invoqueriez grc diff file1 file2
pour voir la sortie colorisée. J'ai aliasé diff
pour grc diff
le rendre plus facile.
fork()
appels, bien que susceptible de fonctionner avec WSL.
Voici une autre solution qui appelle sed
pour insérer les séquences d'échappement ANSI appropriées pour les couleurs pour montrer les +
, -
et les @
lignes 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 ne précise 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 pour définir une couleur appropriée et réinitialiser les attributs de terminal, respectivement.
Pour voir les couleurs disponibles pour chaque argument 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
Comme 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, il s'agit de la sortie de la comparaison de deux fichiers CSV:
Exemple de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiff
maintenant (1.0.16) comprend wdiff
, vous pouvez donc aussi tout tuyau: wdiff -n f1 f2 | colordiff
. wdiff
devrait être fusionné en diffutils ...
Je vous suggère d' essayer diff-so-fancy . Je l'utilise lors de mon travail et ça me semble très bien dès maintenant. Il est livré avec de nombreuses options et il est vraiment facile de configurer vos diffs comme vous le souhaitez.
Vous pouvez l'installer en:
sudo npm install -g diff-so-fancy
ou sur Mac:
brew install diff-so-fancy
Ensuite, vous pouvez mettre en évidence vos différences comme ceci:
diff -u file1 file2 | diff-so-fancy
Avec la commande bat :
diff file1 file2 | bat -l diff
Sur les versions récentes de git sur Ubuntu, vous pouvez activer la mise en évidence des différences avec:
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
Et puis en ajoutant ceci à votre .gitconfig
:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
Il est possible que le script se trouve ailleurs dans d'autres distributions, vous pouvez utiliser locate diff-highlight
pour savoir où.
Différence de couleur au niveau des caractères: installez ccdiff
ccdiff -r /usr/share/dict/words /tmp/new-dict