O pager do Git é menor, mas o que está causando a coloração da saída?

18

lesspor si só não é capaz de destacar a sintaxe, de acordo com este tópico .

No entanto, git diffmostra bem a saída colorida em menos, seu pager padrão. Quando redireciono a saída de git diffpara um arquivo, nenhuma sequência de escape de cores é visível.

Será que git diffsabe onde ele está sendo enviado, e formata a saída em conformidade? Como alguém faria isso?


Acabei de notar que o git colore a diffsaída (por exemplo git diff), no entanto, ele não sabe como destacar a sintaxe em geral. por exemplo

git show 415fec6:log.tex

não habilita nenhuma sintaxe semelhante ao TeX.


Lendo as gitfontes, encontrei as seguintes dicas

em diff.h:

int use_color;

Anteriormente, eu estava me referindo ao realce da sintaxe , mas isso não estava correto. O que quero dizer é corante de saída, veja por exemplo

exemplo de saída colorida

Sebastian
fonte
11
Você tem realce de sintaxe real ou apenas as cores vermelho e verde para linhas removidas e adicionadas?
Paŭlo Ebermann
BTW: para obter cores de git em menos: git diff --color=always | less -r (ou less -Rpara ANSI). BTW: para outros comandos que não paginam por padrão ( git difffaz), você pode git -p some_git_command
ativá-

Respostas:

18

O Git usa isatty()para verificar se stdout é um tty: é usado para verificar se um pager deve ser usado ( pager.c ) e também cores ( color.c ).

ysdx
fonte
ótimo momento, eu também acabei de encontrar!
Sebastian
11

Corrida:

git diff --color=always > output

mostra a cor que sai.

Nada eu encontrei-o em git's color.carquivo:

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
fonte
3

lesspode suportar cores com -r --raw-control-charse-R --RAW-CONTROL-CHARS

Você pode usar o Pythons pygmentizepara realçar e inserir.

Para combinar tudo, configure um filtro menos conforme descrito no superusuário

Matt
fonte
o link é realmente interessante, obrigado. Você sabe se gitestá realmente usando pycementize? Porque não está listado como uma dependência.
Sebastian
btw, quando eu executo git diffo lessprocesso filho não é anexado por nenhuma opção (nem -Rnem -r). No entanto, não sei se o git o chama de uma maneira especial e, portanto, os argumentos não são visíveis htop.
Sebastian
gitgera o código de escape de cores em si mesmo. Também está escrito, cportanto, adicionar o Python seria uma enorme dependência. Ele pode ser capaz de controlar lessatravés do ambiente
Matt
11
talvez através do LESSenv var?
Matt
3
Sim, MENOS = FRX é adicionado ao ambiente (consulte pager.c ).
ysdx 5/09