Le pager Git est moins, mais qu'est-ce qui cause la coloration de sortie?

18

lesslui-même n'est pas capable de mettre en évidence la syntaxe, selon ce fil .

Cependant, git diffmontre bien la sortie colorée en moins, son pager par défaut. Lorsque je redirige la sortie de git diffdans un fichier, aucune séquence d'échappement de couleur n'est visible.

Sait git diffoù il est envoyé et formate la sortie en conséquence? Comment ferait-on cela?


Je viens de remarquer que git colore la diffsortie (par exemple git diff), cependant, il ne sait pas comment mettre en évidence la syntaxe en général. par exemple

git show 415fec6:log.tex

n'active aucune syntaxe de type TeX.


En lisant les gitsources, j'ai trouvé les indices suivants

dans diff.h:

int use_color;

Je faisais précédemment référence à la coloration syntaxique , mais ce n'était pas correct. Ce que je veux dire, c'est la coloration de sortie, voir par exemple

exemple de sortie couleur

Sébastien
la source
1
Avez-vous une véritable coloration syntaxique, ou juste la couleur rouge et verte pour les lignes supprimées et ajoutées?
Paŭlo Ebermann
BTW: pour obtenir une coloration git en moins: git diff --color=always | less -r (ou less -Rpour ANSI). BTW: pour les autres commandes qui ne paginent pas par défaut (le git difffait) vous pouvez l'activer:git -p some_git_command
hyperpallium

Réponses:

18

Git utilise isatty()pour vérifier si stdout est un tty: ceci est utilisé pour voir si un pager doit être utilisé ( pager.c ) ainsi que des couleurs ( color.c ).

ysdx
la source
super timing, je viens aussi de le trouver!
Sebastian
11

Fonctionnement:

git diff --color=always > output

montre la couleur s'échappe.

Merde, je l'ai trouvé dans gitle color.cfichier 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;                                                                 
}  
Sébastien
la source
3

lesspeut supporter la couleur avec -r --raw-control-charset-R --RAW-CONTROL-CHARS

Vous pouvez utiliser Pythons pygmentizepour faire la mise en évidence et le canaliser.

Pour tout combiner, configurez un filtre moins comme décrit sur superutilisateur

Mat
la source
le lien est en effet intéressant, merci. Savez-vous si gitutilise réellement pygmentize? Parce qu'il n'est pas répertorié comme une dépendance.
Sebastian
btw, lorsque j'exécute git diffle lessprocessus enfant n'est ajouté par aucune option (ni -Rni -r). Cependant, je ne sais pas si git l'appelle d'une manière spéciale et donc les arguments ne sont pas visibles dans htop.
Sebastian
gitsort le code d'échappement de couleur c'est lui-même. Il est également écrit, cdonc ajouter Python serait une énorme dépendance. Il pourrait être en mesure de contrôler lessvia l'environnement
Matt
1
peut-être via la LESSvar env?
Matt
3
Oui, LESS = FRX est ajouté à l'environnement (voir pager.c ).
ysdx