Git pager es menor, pero ¿qué está causando el color de salida?

18

lessen sí mismo no es capaz de resaltar la sintaxis, de acuerdo con este hilo .

Sin embargo, git diffmuestra muy bien la salida en color en menos, su buscapersonas predeterminado. Cuando redirijo la salida git diffa un archivo, no se ven secuencias de escape de color.

¿ git diffSabe a dónde se envía y formatea la salida en consecuencia? ¿Cómo haría uno eso?


Acabo de notar que git colorea la diffsalida (por ejemplo git diff), sin embargo, no sabe cómo resaltar la sintaxis en general. p.ej

git show 415fec6:log.tex

no habilita ninguna sintaxis similar a TeX.


Leyendo las gitfuentes, encontré las siguientes pistas

en diff.h:

int use_color;

Anteriormente me refería al resaltado de sintaxis , pero eso no era correcto. Lo que quiero decir es salida de color, ver por ejemplo

salida de color de ejemplo

Sebastian
fuente
1
¿Tiene resaltado de sintaxis real o solo el color rojo y verde para las líneas eliminadas y agregadas?
Paŭlo Ebermann
Por cierto: para obtener coloración git en menos: git diff --color=always | less -r (o less -Rpara ANSI). Por cierto: para otros comandos que no paginan por defecto (lo git diffhace), puede git -p some_git_command
activarlo

Respuestas:

18

Git usa isatty()para verificar si stdout es un tty: esto se usa para ver si se debe usar un localizador ( pager.c ) así como colores ( color.c ).

ysdx
fuente
buen momento, también lo encontré!
Sebastian
11

Corriendo:

git diff --color=always > output

Muestra los escapes de color.

Maldición lo encontré en gitel color.carchivo de:

static int check_auto_color(void)                                           
{                                                                           
  if (color_stdout_is_tty < 0)                                              
    color_stdout_is_tty = isatty(1);                                        
  if (color_stdout_is_tty || (pager_in_use() && pager_use_color)) {         
    char *term = getenv("TERM");                                            
    if (term && strcmp(term, "dumb"))                                       
      return 1;                                                             
  }                                                                         
  return 0;                                                                 
}  
Sebastian
fuente
3

lesspuede soportar color con -r --raw-control-charsy-R --RAW-CONTROL-CHARS

Puede usar Pythons pygmentizepara resaltar y canalizarlo.

Para combinarlo todo, configure un filtro menos como se describe en el superusuario

Mate
fuente
El enlace es realmente interesante, gracias. ¿Sabes si gitrealmente está usando pygmentize? Porque no aparece como una dependencia.
Sebastian
por cierto, cuando ejecuto git diffel lessproceso hijo no se agrega ninguna opción (ni -Rtampoco -r). Sin embargo, no sé si git lo llama de una manera especial y, por lo tanto, los argumentos no son visibles htop.
Sebastian
gitgenera el código de escape de color por sí mismo. También está escrito, por clo que agregar Python sería una gran dependencia. Podría ser capaz de controlar a lesstravés del medio ambiente
Matt
1
tal vez a través de la LESSenv var?
Matt
3
Sí, LESS = FRX se agrega al entorno (ver pager.c ).
ysdx