Git пейджер меньше, но чем обусловлен выходной окрас?

18

lessсам не способен делать подсветку синтаксиса, согласно этой теме .

Тем не менее, git diffприятно показывает цветной вывод меньше, его пейджер по умолчанию. Когда я перенаправляю вывод git diffв файл, не отображаются цветовые escape-последовательности.

Знает ли он git diff, куда он отправляется, и соответственно форматирует вывод? Как можно это сделать?


Я только что заметил, что git окрашивает diffвывод (например git diff), однако, он не знает, как вообще подсвечивать синтаксис. например

git show 415fec6:log.tex

не включает какой-либо TeX-подобный синтаксис.


Читая gitисточники, я обнаружил следующие подсказки

в diff.h:

int use_color;

Ранее я имел в виду подсветку синтаксиса , но это было не правильно. То, что я имею в виду, это выходная окраска, например

пример цветопередачи

Себастьян
источник
1
Есть ли у вас реальная подсветка синтаксиса, или только красный и зеленый цвет для удаленных и добавленных линий?
Пажло Эберманн,
Кстати: чтобы сделать мерзкую окраску меньше: git diff --color=always | less -r (или less -Rдля ANSI). Кстати: для других команд, которые не разбивают на страницы по умолчанию ( git diffделает), вы можете включить его:git -p some_git_command
Гиперпаллиум

Ответы:

18

Git использует, isatty()чтобы проверить, является ли stdout tty: это используется, чтобы увидеть, должен ли использоваться пейджер ( pager.c ), а также colors ( color.c ).

ysdx
источник
отличное время, я тоже только что его нашел!
Себастьян
11

Бег:

git diff --color=always > output

показывает цвет ускользает.

Черт , я нашел его в git«S color.cфайла:

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;                                                                 
}  
Себастьян
источник
3

lessможет поддерживать цвет -r --raw-control-charsи-R --RAW-CONTROL-CHARS

Вы можете использовать Pythons, pygmentizeчтобы сделать выделение и передать его.

Чтобы объединить все это, настройте меньший фильтр, как описано в superuser

Matt
источник
ссылка действительно интересная, спасибо. Знаете ли вы, если gitна самом деле использует пигментирование? Потому что это не указано как зависимость.
Себастьян
Кстати, когда я запускаю git diffдочерний lessпроцесс не добавляется ни одна опция (ни, -Rни -r). Тем не менее, я не знаю, вызывает ли git его специальным образом, и поэтому аргументы не видны в htop.
Себастьян
gitвыводит код выхода цвета это сам. Это также написано cтак, добавление Python будет огромной зависимостью. Это может быть в состоянии контролировать lessчерез окружающую среду
Мэтт
1
может через LESSenv var?
Мэтт
3
Да, LESS = FRX добавляется в среду (см. Pager.c ).
ysdx