Cuando tengo un diff, ¿cómo puedo colorearlo para que se vea bien? Lo quiero para la línea de comandos, así que no hay soluciones GUI.
Cuando tengo un diff, ¿cómo puedo colorearlo para que se vea bien? Lo quiero para la línea de comandos, así que no hay soluciones GUI.
Respuestas:
Las páginas de manual para diffsugerir no hay solución para la coloración desde dentro de sí mismo. Por favor considere usar colordiff. Es un contenedor diffque produce la misma salida que diff, excepto que aumenta la salida usando resaltado de sintaxis coloreada para aumentar la legibilidad:
diff old new | colordiff
o solo:
colordiff old new
Instalación:
sudo apt-get install colordiffbrew install colordiffoport install colordiffless -R, que muestra las secuencias de escape para los colores correctamente.
-yopción para habilitar) ☹ La vimdiffsugerencia a continuación probablemente sea una mejor manera
colordifffunciona bien svn diff | colordiff(es decir, en situaciones en las que solo tiene la diferencia, no los dos archivos que se difunden).
-ysoporte de lado a lado ( ).
Use Vim :
diff /path/to/a /path/to/b | vim -R -
O mejor aún, VimDiff (o vim -d, que es más corto de escribir) mostrará diferencias entre dos, tres o cuatro archivos uno al lado del otro.
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
zsh? No reconozco =(...)constructo. En segundo lugar, lo tenía diff -ur a ben mente.
En realidad, parece haber otra opción (que solo noté recientemente, cuando me encontré con el problema descrito anteriormente):
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
Si tiene Git (que de todos modos ya podría estar usando), podrá usarlo para comparar, incluso si los archivos en sí no están bajo el control de versiones. Si no está habilitado para usted de manera predeterminada, habilitar el soporte de color aquí parece ser considerablemente más fácil que algunas de las soluciones alternativas mencionadas anteriormente.
git diff <(xxd file1) <(xxd filed)no funciona.
git help diff. Entonces, si tu git diff está vacío, intenta cdsalir de donde estás.
git config color.diff auto
git diff --no-indexpara comparar dos archivos.
diff --color La opción se agregó a GNU diffutils 3.4 (2016-08-08)
Esta es la diffimplementación predeterminada en la mayoría de las distribuciones, que pronto la obtendrá.
Ubuntu 18.04 tiene diffutils3.6 y por lo tanto lo tiene.
En 3.5 se ve así:
Probado:
diff --color -u \
<(seq 6 | sed 's/$/ a/') \
<(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
Aparentemente agregado en commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015).
Diferencia de nivel de palabra
Al igual diff-highlight. Parece que no es posible, solicitud de función: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html
Hilos relacionados:
ydiff lo hace sin embargo, ver más abajo.
ydiff nivel de palabra de lado a lado diff
https://github.com/ymattw/ydiff
¿Es este el nirvana?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s
Salir:
Si las líneas son demasiado estrechas (80 columnas predeterminadas), ajuste a la pantalla con:
diff -u a b | ydiff -w 0 -s
Contenido de los archivos de prueba:
una
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
si
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 Integración Git
ydiff se integra con Git sin ninguna configuración requerida.
Desde el interior de un repositorio de git, en lugar de git diff, puedes hacer solo:
ydiff -s
y en lugar de git log:
ydiff -ls
Ver también: ¿Cómo puedo obtener una diferencia de lado a lado cuando hago "git diff"?
Probado en Ubuntu 16.04, git 2.18.0, ydiff 1.1.
There is no word-highlighting, yet- ¿alguna actualización? Esto es para lo que llegué a esta pregunta (quiero una grep --colorsalida diferencial similar).
git diff --colorfunciona también. Útil cuando se trabaja sobre ssh.
diff --color=always | less -R
Y para aquellas ocasiones en las que a yum install colordiffo an apt-get install colordiffno es una opción debido a alguna limitación insana más allá de su control inmediato, o simplemente se siente loco , puede reinventar la rueda con una línea de sed:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
Lance eso en un script de shell y canalice la salida diff unificada a través de él.
Hace que los marcadores de trozos sean azules y resalta nombres de archivo nuevos / antiguos y líneas agregadas / eliminadas en fondo verde y rojo, respectivamente. 1 Y hará que los cambios en el espacio posterior 2 sean más evidentes que el colordiff.
1 Incidentalmente, la razón para resaltar los nombres de archivo de la misma manera que las líneas modificadas es que para diferenciar correctamente los nombres de archivo y las líneas modificadas se requiere analizar correctamente el formato diff, que no es algo que se deba abordar con una expresión regular. Destacarlos de la misma manera funciona "suficientemente bien" visualmente y hace que el problema sea trivial. Dicho esto, hay algunas sutilezas interesantes .
2 Pero no pestañas finales. Aparentemente, las pestañas no tienen su fondo establecido, al menos en mi xterm. Sin embargo, hace que los cambios de tabulación vs espacio se destaquen un poco.
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(aunque espero que haya una mejor manera).
Puede cambiar la configuración de subversion para usar 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
Color, salida de nivel de palabra diff
Esto es lo que puede hacer con el script a continuación y el resaltado de diferencias :
#!/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édito a la respuesta de @ retracile para el sedresaltado)
Yo uso grc(Colouriser genérico), que le permite colorear la salida de una serie de comandos incluidos diff.
Es un script de Python que se puede envolver alrededor de cualquier comando. Entonces, en lugar de invocar diff file1 file2, invocaría grc diff file1 file2para ver la salida coloreada. He alias diffpara grc diffque sea más fácil.
fork()llamadas, aunque es probable que funcione con WSL.
Aquí es otra solución que invoca sedpara insertar las secuencias de escape ANSI apropiados para los colores para mostrar los +, -y @líneas en rojo, verde, y cian, respectivamente.
diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"
A diferencia de las otras soluciones a esta pregunta, esta solución no explica explícitamente las secuencias de escape ANSI. En su lugar, invoca los comandos tput setafy tput sgr0para generar las secuencias de escape ANSI para establecer un color apropiado y restablecer los atributos del terminal, respectivamente.
Para ver los colores disponibles para cada argumento tput setaf, use este comando:
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
Así es como se ve la salida:
Aquí está la evidencia de que los comandos tput setafy tput sgr0generan las secuencias de escape ANSI apropiadas:
$ 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
Como wdiffacepta argumentos que especifican la cadena al principio y al final de ambas inserciones y eliminaciones, puede usar secuencias de color ANSI como esas cadenas:
wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
Por ejemplo, este es el resultado de comparar dos archivos CSV:
Ejemplo de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
colordiffahora (1.0.16) comprende wdiff, por lo que puede también acaba de tubería: wdiff -n f1 f2 | colordiff. wdiffdebería fusionarse en diffutils ...
Te sugiero que pruebes diff-so-fancy . Lo uso durante mi trabajo y seguro que parece genial a partir de ahora. Viene con muchas opciones y es muy fácil configurar sus diferencias de la manera que desee.
Puedes instalarlo de la siguiente manera:
sudo npm install -g diff-so-fancy
o en Mac:
brew install diff-so-fancy
Luego, puede resaltar sus diferencias de esta manera:
diff -u file1 file2 | diff-so-fancy
Con el comando bat :
diff file1 file2 | bat -l diff
En versiones recientes de git en Ubuntu, puede habilitar el resaltado de diferencias 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
Y luego agregando esto a su .gitconfig:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
Es posible que el script se encuentre en otro lugar en otras distribuciones, puede usar locate diff-highlightpara averiguar dónde.
Diferencia de color a nivel de caracteres: instalar ccdiff
ccdiff -r /usr/share/dict/words /tmp/new-dict