Quando ho un diff, come posso colorarlo in modo che appaia bene? Lo voglio per la riga di comando, quindi per favore nessuna soluzione GUI.
Quando ho un diff, come posso colorarlo in modo che appaia bene? Lo voglio per la riga di comando, quindi per favore nessuna soluzione GUI.
Risposte:
Le pagine man per diff
non suggeriscono alcuna soluzione per la colorazione dall'interno di se stesso. Si prega di considerare l'utilizzo colordiff
. È un wrapper diff
che produce lo stesso output di diff, tranne per il fatto che aumenta l'output usando l'evidenziazione della sintassi colorata per aumentare la leggibilità:
diff old new | colordiff
o semplicemente:
colordiff old new
Installazione:
sudo apt-get install colordiff
brew install colordiff
oport install colordiff
less -R
, che visualizza correttamente le sequenze di escape per i colori.
-y
opzione da abilitare) ☹ Il vimdiff
suggerimento che segue probabilmente è un modo migliore
colordiff
funziona bene per svn diff | colordiff
(cioè in situazioni in cui hai solo il diff, non i due file da diffondere).
-y
supporto side by side ( ).
Usa Vim :
diff /path/to/a /path/to/b | vim -R -
O ancora meglio, VimDiff (o vim -d
, che è più breve da digitare) mostrerà differenze tra due, tre o quattro file fianco a fianco.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
ctrl-c
e ctrl-x
hanno altri usi in Vim. ctrl-q
viene catturato da molti terminali. Vedi Scrivere e smettere per trovare il modo più adatto alle tue esigenze.
zsh
? Non riconosco il =(...)
costrutto. Secondo, avevo diff -ur a b
in mente.
In realtà sembra esserci ancora un'altra opzione (che ho notato solo di recente, quando ho riscontrato il problema sopra descritto):
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
Se hai Git in giro (che potresti già utilizzare comunque), sarai in grado di usarlo per il confronto, anche se i file stessi non sono sotto controllo della versione. Se non abilitato per impostazione predefinita, l'abilitazione del supporto colore qui sembra essere notevolmente più semplice di alcune delle soluzioni alternative menzionate in precedenza.
git diff <(xxd file1) <(xxd filed)
non funziona.
git help diff
. Quindi, se il tuo git diff sta diventando vuoto, prova cd
da dove ti trovi.
git config color.diff auto
git diff --no-index
per confrontare due file.
diff --color
opzione è stata aggiunta a GNU diffutils 3.4 (08-08-2016)
Questa è l' diff
implementazione predefinita sulla maggior parte delle distribuzioni, che presto la riceveranno.
Ubuntu 18.04 ha diffutils
3.6 e quindi ce l'ha .
Su 3.5 sembra così:
Provato:
diff --color -u \
<(seq 6 | sed 's/$/ a/') \
<(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
Apparentemente aggiunto in commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (mar 2015).
Diff. A livello di parola
Come diff-highlight
. Sembra impossibile, richiesta di funzionalità: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html
Discussioni correlate:
ydiff
lo fa però, vedi sotto.
ydiff
diff a livello di parola fianco a fianco
https://github.com/ymattw/ydiff
Questo è il Nirvana?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s
Risultato:
Se le linee sono troppo strette (80 colonne predefinite), adatta allo schermo con:
diff -u a b | ydiff -w 0 -s
Contenuto dei file di test:
un'
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
Integrazione Git
ydiff
si integra con Git senza alcuna configurazione richiesta.
Dall'interno di un repository git, invece di git diff
, puoi fare solo:
ydiff -s
e invece di git log
:
ydiff -ls
Vedi anche: Come posso ottenere una differenza side-by-side quando faccio "git diff"?
Testato su Ubuntu 16.04, git 2.18.0, ydiff 1.1.
There is no word-highlighting, yet
- eventuali aggiornamenti? Questo è ciò per cui sono arrivato a questa domanda (voglio un grep --color
output diff simile a quello).
git diff --color
funziona anche. Utile quando si lavora su ssh.
diff --color=always | less -R
E per quelle occasioni in cui a yum install colordiff
o an apt-get install colordiff
non è un'opzione a causa di un vincolo folle al di là del tuo controllo immediato, o ti senti semplicemente pazzo , puoi reinventare la ruota con una linea di sed:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
Lancialo in uno script di shell e inoltra un output diff unificato attraverso di esso.
Rende i marcatori di hunk blu e mette in risalto i nomi di file nuovi / vecchi e le linee aggiunte / rimosse sullo sfondo verde e rosso, rispettivamente. 1 E renderà lo spazio di trascinamento 2 cambiamenti più evidenti di quanto possa fare Colordiff.
1 Per inciso, la ragione per evidenziare i nomi dei file come le linee modificate è che per differenziare correttamente tra i nomi dei file e le linee modificate è necessario analizzare correttamente il formato diff, che non è qualcosa da affrontare con una regex. Evidenziando loro lo stesso funziona "abbastanza bene" visivamente e rende il problema banale. Detto questo, ci sono alcune sottigliezze interessanti .
2 Ma non le schede finali. Apparentemente le schede non ottengono lo sfondo impostato, almeno nel mio xterm. Fa tuttavia risaltare un po 'i cambiamenti tra tabulazione e spazio.
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
(anche se mi aspetto che esista un modo migliore).
È possibile modificare la configurazione di sovversione per usare 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
Colorato, word-livello di diff
ouput
Ecco cosa puoi fare con lo script seguente e 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
( Ringraziamo la risposta di @ retracile per l' sed
evidenziazione)
Uso grc
(Colorizer generico), che consente di colorare l'output di un numero di comandi incluso diff
.
È uno script Python che può essere avvolto attorno a qualsiasi comando. Quindi, invece di invocare diff file1 file2
, invocheresti un grc diff file1 file2
output colorato. Ho alias diff
per grc diff
per rendere più facile.
fork()
chiamate, sebbene probabilmente funzioni con WSL.
Ecco un'altra soluzione che invoca sed
l'inserimento delle sequenze di escape ANSI appropriate affinché i colori mostrino +
, rispettivamente -
, e le @
linee in rosso, verde e ciano.
diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"
A differenza delle altre soluzioni a questa domanda, questa soluzione non spiega esplicitamente le sequenze di escape ANSI. Invece, invoca i comandi tput setaf
e tput sgr0
per generare le sequenze di escape ANSI per impostare un colore appropriato e ripristinare gli attributi del terminale, rispettivamente.
Per visualizzare i colori disponibili per ciascun argomento tput setaf
, utilizzare questo comando:
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
Ecco come appare l'output:
Ecco le prove che i comandi tput setaf
e tput sgr0
generano le sequenze di escape ANSI appropriate:
$ 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
Poiché wdiff
accetta args che specifica la stringa all'inizio e alla fine di entrambi gli inserimenti e le eliminazioni, è possibile utilizzare sequenze di colori ANSI come tali stringhe:
wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
Ad esempio, questo è l'output del confronto tra due file CSV:
Esempio da https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiff
ora (1.0.16) comprende wdiff
, in modo da poter anche solo del tubo: wdiff -n f1 f2 | colordiff
. wdiff
dovrebbe essere unito in diffutils ...
Ti suggerirei di provare diff-so-fancy . Lo uso durante il mio lavoro e sicuramente mi sembra fantastico da ora. Viene fornito con molte opzioni ed è davvero facile configurare i tuoi diff come preferisci.
Puoi installarlo tramite:
sudo npm install -g diff-so-fancy
o su Mac:
brew install diff-so-fancy
Successivamente, puoi evidenziare le tue differenze in questo modo:
diff -u file1 file2 | diff-so-fancy
Con il comando bat :
diff file1 file2 | bat -l diff
Nelle versioni recenti di git su Ubuntu, puoi abilitare l'evidenziazione diff con:
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
E quindi aggiungendo questo al tuo .gitconfig
:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
È possibile che lo script si trovi da qualche altra parte in altre distro, è possibile utilizzare locate diff-highlight
per scoprire dove.
Differenza colore a livello di carattere: installa ccdiff
ccdiff -r /usr/share/dict/words /tmp/new-dict