unix linux - ¿Cómo colorear dif en la línea de comando?




terminal colors (9)

Y para aquellas ocasiones en las que un yum install colordiff o un yum install colordiff apt-get install colordiff no es una opción debido a alguna restricción insensata 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[[email protected]/;s/$/\x1b[0m/'

Tira eso en un script de shell y canaliza la salida de diff unificada a través de él.

Hace que los marcadores de hunk sean azules y resalte los nombres de archivo nuevos / antiguos y las líneas agregadas / eliminadas en fondo verde y rojo, respectivamente. 1 Y hará que los cambios finales en el espacio 2 sean más evidentes que el colordiff.

1 Incidentalmente, la razón para resaltar los nombres de archivo de la misma forma que las líneas modificadas es que para diferenciar correctamente entre los nombres de archivo y las líneas modificadas es necesario analizar correctamente el formato diff, que no es algo que se deba abordar con una expresión regular. Resaltarlos lo mismo funciona "suficientemente bien" visualmente y hace que el problema sea trivial. Dicho esto, hay algunas sutilezas interesantes .

2 Pero las pestañas no se arrastran. Al parecer, las pestañas no tienen su conjunto de fondo, al menos en mi xterm. Sin embargo, hace que los cambios de tabulación contra espacio se destaquen un poco.

Cuando tengo un diff, ¿cómo puedo colorearlo para que se vea bien? Lo quiero para la línea de comando, así que por favor no hay soluciones GUI.


En realidad, parece haber otra opción (que solo noté recientemente, cuando me encontré con el problema descrito anteriormente):

git diff <file1> <file2>

Si tiene Git alrededor (que ya podría estar usando de todos modos), entonces podrá usarlo para comparar, incluso si los archivos en sí no están bajo el control de la versión. Si no está habilitado para usted por defecto, entonces habilitar el soporte de color aquí parece ser considerablemente más fácil que algunas de las soluciones alternativas mencionadas anteriormente.


Como wdiff acepta wdiff 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, esta es la salida de comparar dos archivos CSV:

Ejemplo de https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html


Uso grc (Generic Colouriser), que te permite colorear la salida de una serie de comandos, incluyendo diff .

Es una secuencia de comandos de python que se puede envolver alrededor de cualquier comando. Entonces, en lugar de invocar diff file1 file2 , deberías invocar grc diff file1 file2 para ver resultados coloreados. Tengo alias diff to grc diff para que sea más fácil.


diff --color opción diff --color se agregó a GNU diffutils 3.4 (2016-08-08)

Esta es la implementación predeterminada de diff en la mayoría de las distribuciones, que pronto la recibirán. Ubuntu 18.04 tiene diffutils 3.6.

En 3.5 se ve así:

con:

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

Aparentemente agregado en commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015).

También he solicitado la diferencia de nivel de palabra desde diff-highlight en: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html


Puedes 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

a través de: https://gist.github.com/westonruter/846524


Coloreado, salida a nivel de palabra

Esto es lo que puede hacer con el siguiente script y diff-highlight :

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "[email protected]" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;[email protected]/;s/$/\x1b[0m/' |
  diff-highlight

(Crédito a la respuesta de @ retracile para el resaltado)


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 realmente fácil de configurar las diferencias de la forma que desee.

Puedes instalarlo por:

sudo npm install -g diff-so-fancy

Aquí está la solución más simple y legible. Con bashj ( https://sourceforge.net/projects/bashj/ ), simplemente elegiría una de estas líneas:

#!/usr/bin/bash

W="Hello world!"
echo $W

R=130
G=60
B=190

echo u.colored($R,$G,$B,$W)

echo u.colored(255,127,0,$W)
echo u.red($W)
echo u.bold($W)
echo u.italic($W)

Y=u.yellow($W)
echo $Y
echo u.bold($Y)

256x256x256 Los colores están disponibles si tiene el soporte de color en su aplicación de terminal.





unix command-line colors diff