Решаем проблемы с цветным выводом Git в NetBSD

Posted on November 26, 2011

Я, как и многие другие, использую для большинства своих (и не только своих) проектов систему контроля версий Git . Разумеется, основным способом интеракции с гитом является ядреная консоль, в которой я и делаю все основные операции - бранчую, коммичу, пушаю, мержу, инспектирую диффы.

Восприятие таких объемов разношерстной текстовой информации в терминале заметно улучшается с использованием подсветки. Да! Как бы ни смешно это звучало, некоторые не знают о том, что многие выхлопы гита поддаются раскраске, и что не надо лезть в git[gk] , чтобы посмотреть всего-навсего изменения в коммитах в приятной для глаз форме.

Счастье наступает после выполнения заветной команды:

git config --global color.ui auto

В современных линуксах дополнительный бубен после этого не требуется – выхлопы diff , status , log и прочих команд сразу заблещут новыми красками.

Однако, в моей любимой ОС потребуется немного напильника: вывод как минимум git diff мало того, что останется монохромным, так и будет засорён многочисленными отображаемыми escape-последовательностями, которые должны были задать цвета, да не задали и напечатались сами.

Решается это очень просто. В файле .profile , который находится у нас в домашней директории, меняем значение переменной PAGER на less :

PAGER=less

…и строчкой ниже пишем:

LESS="-rQ"

Всё! Дальше пойдёт моя графомания, её можно не читать.

Что это было?

Выхлопы проблемных команд, таких, как git diff , git log и прочих, обычно занимают много места, не влезают в экран и требуют всяких фич вроде постраничной прокрутки, локального поиска и т.п. Чтобы не реализовывать этот функционал каждый раз, в лучших традициях Unix-вея используется классический конвеерный подход - от определенной команды требуется получить только текстовый вывод, а операции по представлению его на экране и навигации берёт на себя уже другая программа. По такому же принципу работает man : одна программа осуществляет распаковку справочной страницы, другая – форматирование, третья – вывод на экран.

Естественно, всё это дело настраивается, и имя программы, которое будет использовано в таких конвеерах для вывода на экран, указывается в переменной окружения PAGER .

Пейджеров исторически сложилось два. Первый, more , не умел прокручивать текст назад, только вперёд, поэтому был написан второй, less , в котором и была реализована столь необходимая функциональность.

В NetBSD разницы между more и less нет, потому что more – это второе имя less (в этом можно убедиться, сняв хэш-суммы от обоих файлов из /usr/bin ). Так что первая правка в .profile просто устраняла неопределенность.

В переменной окружения LESS , как читатель, наверно, уже мог догадаться, задаются параметры, с которыми будет запускаться less . Самый важный из указанных – r – просит пейджер не экранировать управляющие последовательности, а выводить их как есть – чтобы вышестоящая инстанция их увидела “как есть” и раскрасила текст соответственно. С ключем Q пейджер перестанет пищать навсегда.