'наблюдайте, что мерзавец регистрируется' с корректными цветами

Я хочу watch вывод git log --oneline --graph со всеми цветами и попробованный для адаптации решения от того, Почему мерзавец окрашивает, не появляются при использовании часов?, но это просто представляет (почти) целый вывод в оранжевом:

Выходное использование watch -c

$ watch -c git -c color.diff=always log --graph --oneline

enter image description here

Отметьте, как от первого хеша фиксации на всем печатается в оранжевом. Это - вывод watch from procps-ng 3.3.10 на Ubuntu 16.04.

Нормальный вывод = цель

$ git log --graph --oneline

enter image description here

Вывод с дополнительным -c color.diff=always то же, cat -A показывает используемые последовательности цвета ANSI:

$ git -c color.diff=always log --graph --oneline | cat -A
* ^[[33m8ccd905^[[m L
* ^[[33me4ad4f6^[[m E
* ^[[33mf427d2a^[[m U
* ^[[33me8351c8^[[m Z
* ^[[33mf06747c^[[m I

Вопрос

Как я могу добраться watch git log показать цвета как git log ?

1
задан 22 October 2017 в 19:42

3 ответа

Это было , ошибка в procps-ng (имя пакета Ubuntu procps), зафиксировала в версии 3.3.11.

Последняя Ubuntu, LTS (16.04 Гостеприимных) все еще содержит ошибку, тогда как текущие регулярные версии (17.04 Пикантных и 17.10 Ловких) уже поставляют исправленную версию.

3
ответ дан 3 December 2019 в 06:37

Комментарий egmont говорит о том, что watch не распознает ANSI 39 (сброс только цвета переднего плана). Это ^[[39m, как указано WJAndrea . Другие ответили, что это ошибка в procps-ng.

В других командах git, таких как diff, заметно, что жирный цвет работает, но любой неокрашенный текст, который следует, сохраняет предыдущий цвет, пока не появится новый жирный цвет. Причина в том, что жирные цвета указывают '^ [[1; ## m'.

Итак, мы знаем, где сосредоточиться.

Сначала я сделал быстрое регулярное выражение с sed, чтобы заменить все цвета на жирный, и работал просто отлично. Для этого требовался только начальный жирный цвет, поскольку вывод некоторых команд git не начинался с цвета, и до первого цветового кода был начальный обычный текст.

Я тестировал во второй половине дня, и этот массивный жирный текст привлек мое внимание.

Я использую i3wm , поэтому я держу некоторые терминалы открытыми рядом. И один яркий и красочный терминал, смотрящий мой журнал мерзавцев, начинал раздражать. До сегодняшнего дня я жил с неокрашенным журналом: c

Другая проблема заключается в том, что я жестко прописал жирный светло-серый цвет для замены неокрашенного текста: люди, использующие другие цветовые схемы, могли кричать на меня. [тысяча сто двадцать семь] 1128 Чтобы решить все, я изменил свою первоначальную идею на нечто более простое. Вместо того, чтобы выделять текст жирным шрифтом, мне просто нужно добавить 0, чтобы сделать цветовой код действительным для watch. Изменились несколько персонажей и вуаля! Цвета выглядят так, как и ожидалось, жирный текст сохраняет свое значение, а окно, висящее вокруг, чувствует себя лучше.

Я проверил производительность с огромной историей коммитов (> 90k коммитов), и есть заметная задержка в несколько миллисекунд, если вы используете флаги --graph или --date-order и, возможно, другие, но кажется --oneline безопасный. Даже запрос на регистрацию только нескольких коммитов приводит к задержке, Git должен обработать всю историю, чтобы сгенерировать график.

1130 Но этот случай был крайним. И вам не нужно обновление 0,1 с. 3 или 4 выглядит хорошо. watch -n #

Мой текущий код следующий:

#!/bin/bash
git -c color.ui=always "$@" | sed -r  

Я сохранил в ~/bin/git-colored с разрешением + x и его можно использовать с git colored <git command>

Решение основного поста: watch -c 'git colored log --oneline --graph'

Я создал gist с этим файлом, где вы можете увидеть историю кода.

TL; DR

В пакете Ubuntu есть ошибка. Однострочный код выше - это обходной путь для тех, кто не может / не хочет обновлять систему, в основном делая то, что описано в здесь .

s/\033\[([[:digit:]][[:digit:]])m/\033\[0;\\1m/g; s/\033\[m/\033\[0m/g'

Я сохранил в ~/bin/git-colored с разрешением + x и его можно использовать с git colored <git command>

Решение основного поста: watch -c 'git colored log --oneline --graph'

Я создал gist с этим файлом, где вы можете увидеть историю кода.

TL; DR

В пакете Ubuntu есть ошибка. Однострочный код выше - это обходной путь для тех, кто не может / не хочет обновлять систему, в основном делая то, что описано в здесь .

1
ответ дан 3 December 2019 в 06:37

Быстрое обходное решение, которое я сделал, если у Вас нет procps-ng 3.3.11: передайте свой вывод мерзавца по каналу через sed "s/\x1b\[m/\x1b\[00m/", например, для git status:

watch -c 'git -c color.ui=always status | sed "s/\x1b\[m/\x1b\[00m/"'

Это заменяет пустые Escape ANSI ([m, не распознанный watch) с обнуленными ([00m, полностью распознанный watch).

1
ответ дан 3 December 2019 в 06:37

Другие вопросы по тегам:

Похожие вопросы: