Pull to refresh

Comments 79

интересно.
А вообще еще можно посмотреть в сторону grc, например, который из коробки умеет раскрашивать некоторое количество общеизвестных утилит.

Автор молодец, такое сделать.
Раскрашивать общеизвестные утилиты нынче только ленивый не умеет. Но все (все!) они используют олдскульные 16 цветов. И grc (который, как и всякий комбайн, заведомо проигрывает vimdiff+tig для гита, ну и так далее) — тоже пугает вырвиглазностью.

Я говорю а) про свой лог и б) про настройку любых сторонних утилит раскраски пастельными цветами.
А пример не могли бы привести, к примеру, для какого-нить лога, если Вам не сложно.
А то я что-то сходу и не могу понять, как раскрашивать уже лежащий на винте чисто текстовый лог, например.
Если уже лежащий на винте, то взять тот же grc и подправить ему в конфигах цвета на человеческие.
А если этот лог пишет ваш код — то тут прямо раззудись плечо:
def err txt
  puts "\e[01;38;05;222;48;05;196m[ERR] \e[0m#{txt}"
end
Ну и PS1, конечно, переписан с нуля.

Не мучайте себя, возьмите zsh. Здесь цвета сокращаются до %F{blue}…%f/%K{blue}…%k (только первые 16, остальные имеют число вместо имени) (Foreground, bacKground), %B…%b для жирного, %U…%u — подчеркнутого и %S…%s — инверсного (похоже zsh не предоставляет возможности сделать текст наклонным с помощью %{char}. Не представляет проблемы, так как konsole и xterm всё равно это не поддерживают, только urxvt).
Спасибо за совет, я уже и не вспомню, сколько лет назад перешел на zsh. Чисто смеха ради, могу сказать, что цветной промпт, который я держу в гите вместе с другими настройками иногда выкатывается на чужие машины. Где, сюрприз, иногда бывают другие шеллы. Да и коллеги мои не всегда хотят на него переходить. Странно, правда, заставлять человека для чтения логов накатить другой шелл?

И, честно признаться, я все равно не способен в голове высчитать число, которое нужно запихнуть в %F, чтобы получить бирюзовый на алом. А моему скрипту все равно, что генерировать.

Накатить для логов — нет. Когда меня попросили добавить в formatvim вывод с помощью ANSI escape последовательностей, мне тоже пришлось с этим разбираться. А вот писать PS1 в таком виде я бы никогда не стал. Точно так же, как не стал бы использовать в PS1 что‐то, кроме первых 16 цветов — мне ещё случается работать во framebuffer.
Относительно PS1 в других оболочках — я в этом отношении предпочитаю оставить приглашение по‐умолчанию или, в любом случае, отличное от того, что у меня в zsh, чтобы оно всегда напоминало мне о том, что это другая оболочка, в которой недоступны привычные мне возможности zsh.
А чем вам if не угодил-то? Framebuffer вам скажет «linux» на «echo $TERM».
Кроме того я не предлагаю прямо эти кракозябры лепить. Можно же свой %F написать.
Зачем мне if, если можно просто иметь приглашение, которое работает везде?

Как сделать в bash такое же приглашение, как в zsh, я легко могу решить. Но это не добавит возможностей zsh в bash.
А по-моему, нагляднее сразу же в консольке посмотреть, что получится из той или иной escape-последовательности при помощи скриптика.
По ссылке пишут про «TERM=xterm256color», а в статье про «TERM=xterm-256color». Вопрос: в чём правда, брат? =)
Спасибо, теперь по ссылке тоже пишут правильно.
grep и tail цветных логов взрывает мне мозг.
Ну так приличный софт проверяет, что за терминал используется, подсвечивая выхлоп цветом только если это действительно терминал, а не файл или труба.
Дык, вы же выхлоп run_with_log отправляете в трубу. Следовательно, если этот самый run_with_log написан по-человечески, мусора в grep не будет.
Научите, пожалуйста, изнутри run_with_log определить, что мой вывод перенаправили в пайп.
Пожалуйста.
Код
#include <stdio.h>
#include <unistd.h>

#define RED         "\033[1;32;41m"
#define GREEN       "\033[5;30;42m"
#define OLDCOLOR    "\033[0;0;0m"

main(){
	if(isatty(STDOUT_FILENO)) printf(RED "This is a TTY! " GREEN "Output may be colorized!" OLDCOLOR "\n");
	else printf("This is pipe, no colors!\n");
}


Выхлоп

Вот уж воистину: век живи — век учись. Спасибо!
А вот так можно сделать цветной printf
#define RED			"\033[1;31;40m"
#define GREEN		"\033[1;32;40m"
#define OLDCOLOR	"\033[0;0;0m"

int (*red)(const char *fmt, ...);
int (*green)(const char *fmt, ...);

int r_pr_(const char *fmt, ...){
	va_list ar; int i;
	printf(RED);
	va_start(ar, fmt);
	i = vprintf(fmt, ar);
	va_end(ar);
	printf(OLDCOLOR "\n");
	return i;
}

int g_pr_(const char *fmt, ...){
	va_list ar; int i;
	printf(GREEN);
	va_start(ar, fmt);
	i = vprintf(fmt, ar);
	va_end(ar);
	printf(OLDCOLOR "\n");
	return i;
}

int main(int argc, char *argv[]){
	if(isatty(STDOUT_FILENO)){ // make color output in tty
		red = r_pr_; green = g_pr_;
	}else{ // no colors in case of pipe
		red = printf; green = printf;
	}
…
	red("Красный текст\n");
…
	green("Зеленый текст\n");
}


«Раньше были времена, а теперь мгновения. Раньше поднимался …, а теперь — давление.»

Кто ж нынче на си-то вывод раскрашивает? А на руби это две строчки ;-)
> Кто ж нынче на си-то вывод раскрашивает?
Я раскрашиваю. Язык простой, да и не знаю я больше ни одного ЯП, кроме С (мне и не надо — работа с программированием почти не связана). А хочется иной раз цветом важные моменты «выхлопа» программы подчеркнуть.
Во-первых, вы знаете еще как минимум shell script. Во-вторых — это во мне ностальгия разговаривает вместо меня самого.

Я всегда считал, что если человек задумывается о «выхлопе» — это настоящий программист. А если знает 800 языков — еще не факт.
> вы знаете еще как минимум shell script

Это не ЯП в строгом смысле слова.

> Я всегда считал, что если человек задумывается о «выхлопе» — это настоящий программист

Ну, я-то программистом не являюсь.
Python
import sys

RED = "\033[1;32;41m"
GREEN = "\033[5;30;42m"
OLDCOLOR = "\033[0;0;0m"

if sys.stdout.isatty():
    print("".join([
        RED,
        "This is a TTY! ",
        GREEN,
        "Output may be colorized!",
        OLDCOLOR
    ]))
else:
    print("This is pipe, no colors!")
Да, спасибо, я уже и на руби справился.
А есть пример того, как оно должно выглядеть?
Я не люблю доверять скриптам, в которых такая кодировка. Кроме того там явно видны циклы seq 30 37, что тоже не особо радует.
Попробуйте на целевой убунте «sudo apt-get install ncurses-term».
да-да. я не успел отписать что именно так и пофиксил. оказывается эти терминалы не стоят по-умолчанию!
Тот скрипт — для 16 цветов.
Вот — он же для полного вырвиглазия:
Скрытый текст
#!/bin/bash
TERM="xterm-256color"
COLRS="$(seq 1 8 256)"

for A in 1 2 4 5 7 8 9
	do
	echo -e "\033[0m\n\n Свойство $A:\n"
	for B in $COLRS
		do
		echo -e  "\nЦвет $B\c"
		for C in $COLRS
			do
				echo -e "\033[$A;38;05;$B;48;05;$C""m Фон $C\t\c"
			done
		echo -e "\033[0m\c"
		done
	done
echo -e "\033[0m\n\n"

Вот пример (подсократил, чтобы влезло в один экран):
> последовательность «\e[01;04;38;05;196;48;05;232m» включит режим жирного подчеркнутого красного на черном фоне.

Не нужно ESC коды писать. Здесь вам не DOS.

echo -e "`tput bold; tput smul; tput setaf 196; tput setab 232`bold-underline-red-on-black"

man terminfo
Я знаю, спасибо.

Попробуйте написать syntax highlighter для HTML и терминала одновременно, и поймете, зачем могут потребоваться коды. Кроме того, числа 196 и 232 нужно откуда-то взять. Я не умею их в голове высчитывать.
Замечу, что в Mac OS X (терминал iTerm2) так же работает, но пример с сайта из топика надо модифицировать:

$ export MY_CLR=$'\e[01;38;05;108;48;05;17m'
$ echo "${MY_CLR}Hello"


Отличие — в кавычках при установке MY_CLR.
Когда я выйду на пенсию, я допишу проверку браузера посетителя и генерацию правильного примера ;-)

Ну это же просто пример, смысл-то в последовательности. В смысле, если вам зачем-то нужна эта последовательность, то вы уж наверняка знаете, как в вашем шелле принято переменные объявлять.
Ну это верно, я статью прочёл с удовольствием, но решил оставить «хинт» для маководов, ленящихся экспериментировать ;)

Кстати, раз уж Вы всё равно займётесь этим сервисом на пенсии, сделайте, пожалуйста, генерацию и для zsh тоже. Мне вот для проверки пришлось bash включать. Хотя, для скриптов обычно именно bash идёт, так что у меня всё ок в принципе =)
Уточните, пожалуйста, в чем именно проблема.
Я сам на zsh и все тестировалось там же. У вас, судя по всему, что-то с TERM в zsh не алё.
Собственно, выглядит так:


А TERM задаётся в настройках iTerm2 и по умолчанию «xterm-256color», так что тут менять ничего не надо =)
Ой.

А можно вас попросить попробовать вместо «\e» — «\033» и, особенно, настоящий Esc (вводится последовательным нажатием клавиш «Ctrl+V» и «Escape»)? Я повторить на zsh@ubuntu не могу.
С 033 и escape — то же самое. Может быть дело в oh-my-zsh?
У меня тоже oh-my-zsh (у нас даже тема одна почти и та же, если вглядеться в мой пример на сайте). Дело, кажется, в разворачивании переменной. Ваш шелл почему-то всегда ${AAA} хочет выплюнуть на stdout.
Я попробую дотянуться до мака и починить, конечно же.
export MY_CLR=$'ONE'
echo "${MY_CLR}"

— два раза «ONE» печатает?
$  export AAA=$'AAA_AAA'
$  echo "${AAA}BBB"
AAA_AAABBB

Всё вроде как нормально
Ладно, наскоком не вышло. Я попробую разобраться.
Ну жа, это было первое, что я сам проверил.
Спасибо!
попробуйте echo -e "${MY_CLR}Hello"
и у меня не заработало с \e, но заработало с \033
Увы, результат аналогичный. =(
macbook-011:~$ zsh
macbook-011% echo $TERM
xterm-color
macbook-011% export A='\033[01;38;05;108;48;05;17m'
macbook-011% echo -e "${A}Hello"                   
Hello
macbook-011% 

Hello ярко белый и моргает
Кстати да, если без $ строку объявлять, а просто в одинарных кавычках, то всё работает.
Хм.

Спасибо! =)
Спасибо!

Только поясните, что значит «моргает»? И почему ярко-белый? Иными словами, если вы возьмете с сайта какой-нибудь вариант типа «\033[01;04;38;05;160;48;05;222m» (жирный красный на желтом с подчеркиванием) — он именно так отобразится? Или для мака (как обычно ;-)) все переписывать придется?

Похоже, вынужден Вас огорчить, ибо "\033[01;04;38;05;160;48;05;222m" у меня на маке (с xterm-color) отображается как подчеркнутый яркий белый, мигающий.
Но, в никсах, при том же xterm-color (не 256color, может в этом причина) отображается так же.

Но, опять-таки, может дело в моем терминале.

У меня вот так, а мигающего добиться не удалось =)
мигающего добиться не удалось


Спасибо! Вы сейчас немного приуменьшили энтропию.
image
и моргает (красненькое — то уже не то)
не 256color, может в этом причина

Конечно, причина в этом. Я даже в записи об этом обмолвился.
export TERM=xterm-256color

— должно помочь.
$ bash
macbook-011:~$ echo $TERM
xterm-color
macbook-011:~$ export A="\033[01;38;05;108;48;05;17m"
macbook-011:~$ echo -e "${A}Hello"
Hello
macbook-011:~$ export A="\e[01;38;05;108;48;05;17m"
macbook-011:~$ echo -e "${A}Hello"
\e[01;38;05;108;48;05;17mHello

macbook-011:~$ export TERM=xterm-256color                                                                             
macbook-011:~$ echo $TERM                                                                                             
xterm-256color
macbook-011:~$ export A="\033[01;38;05;108;48;05;17m"                                                                 
macbook-011:~$ echo -e "${A}Hello"                                                                                    
Hello
macbook-011:~$ export A="\e[01;38;05;108;48;05;17m"                                                                   
macbook-011:~$ echo -e "${A}Hello"                                                                                    
\e[01;38;05;108;48;05;17mHello


$ zsh
macbook-011% echo $TERM
xterm-color
macbook-011% export A="\033[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello
macbook-011% export A="\e[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"                 
Hello
macbook-011% export TERM=xterm-256color              
zsh: can`t find terminal definition for xterm-256color
macbook-011% echo $TERM
xterm-256color
macbook-011% export A="\033[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello
macbook-011% export A="\e[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello 


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

Я, к сожалению, начал понимать, что вариантов OS×SHELL×CIRCUMSTANCES здесь, как обычно, стопиццот.

Я попробую написать что-то внятное на страничке под заголовком «troubleshooting», когда соберу все случаи факапа.
Да, так и отображается, всё ок.
Ярко-белый у меня не моргает — уж не знаю почему =)
Fix от jackz — убираем символ $, меняем «e» на «033» и всё работает в zsh:

$ export MY_CLR='\033[01;38;05;108;48;05;17m'
$ echo "${MY_CLR}Hello"
Я это… читаю комментарии к своей записи :-).

Там пока есть вопросы: habrahabr.ru/post/161999/#comment_5563239

У вас получается то, что нужно? Я просто почти вышел на пенсию и готов допилить правильный показ команды. Но мака под рукой по-прежнему нет.
Вкратце для макоси в zsh надо:

1. Делать экспорт надо в одинарных кавычках.
2. Вместо "\e" ставить "\033".

Для bash же надо оставить "\e" — 033 там не работает почему-то.
Ога. На страничке все поправил уже. Вот только баш, или zsh, — у человека, пришедшего ко мне на сайт, я определять не умею.

Посоветуйте, как правильно оставить «заглавную строку»? Я сейчас к «\033» склонился, плюс там же есть еще блок «варианты».
Мне кажется, лучше в блоке с вариантами сделать подсказку: это для bash, это для zsh.
Моя убунта понимает оба, доступный rhel — только ровно наоборот вашему рассказу.

В общем, я постараюсь охватить все многообразие, но держу в уме, что если уж кто-то пришел за esc-последовательностью, дальше он сам справится.

Это негодный паттерн, я понимаю. Но у меня следующая запись в эти блоги рискует быть гораздо интереснее.
Но у меня следующая запись в эти блоги рискует быть гораздо интереснее.

Дык я и подписался в расчёте на интересные статьи )
Хорошая ссылка по теме: frexx.de/xterm-256-notes/
Есть ссылки на perl-скрипты для отображения набора всех цветов в консоли: один скрипт показывает все цвета с их номерами (xterm-colortest), другой — просто красивый color cube (256colors2.pl).
Также в самом конце есть совет, как «включить» 256 цветов в screen'ах.
Ага, спасибо, вынес в запись. Поделитесь секретом, о чем нужно спросить гугл, чтобы он это отдал?

;-)

Т.к. у меня на фре в screen'ах не отображались 256 цветов (и скрины и xterm собраны с поддержкой 256 цветов), я гуглил по «freebsd screen 256 color». Третья ссылка (http://www.in-nomine.org/2005/09/20/screen-256-colours-and-termcap-mixed-with-putty-and-freebsd/ — в статье, кстати, есть рецепт и для vim'а, но мне он не пригодился), последний комментарий и ведёт на frexx.de/xterm-256-notes/ =)
Кстати, у меня xterm и с TERM=xterm показывает 256 цветов. Т.е. изменение TERM на FreeBSD вообще не потребовалось. В том числе и для screen'ов.
Охтыж!

Вспомнил смешную историю.
Меня как-то коллега попросил помочь нагуглить решение какой-то проблемы. Я занят был, поэтому лаконично посоветовал: «добавляй ко мне запросам „slackware“». Еще два года вся команда на любой мой вопрос (типа «кофе идем пить?») хором отвечала: «а слакварь с нами?».

Ну теперь я знаю, что «freebsd» — тоже ключевое словцо.
Если интересно, у меня есть скрипт, который выдаёт список из #RRGGBB кодов всех цветов для текущего терминала. Для работы требуется Vim, wmctrl (желательно), perl, YAML::XS, imagemagick (консольные команды и perl bindings). Желательно, чтобы окно терминала не имело декораций. Код, определяющий месторасположение таблицы цветов, по идее, должен работать с почти всеми декорациями, но медленно. Для работы также требуется, чтобы чёрный фон отличался от белого. Никаких более требований нету.

Там же — списки цветов для используемых мною терминалов (откуда я взял default-8 уже не помню, у wineconsole цвета другие). Цвета у всех используемых мною эмуляторов (rxvt-unicode USE+=256-color, xterm, konsole) везде одинаковые, первые 16 цветов у konsole отличаются (и настраиваются). Насколько мне известно, как минимум xterm позволяет настраивать вообще все цвета.
Та не, «freebsd» в запросе было не просто для количества =) Судя по тэгам статьи, Вы экспериментировали под linux'ом. Я же работаю на фре. И по опыту знаю, что, если гуглить что-то по nix-тематике без конкретизации, то linux'овых решений будут столько, что найти нужное для freebsd будет проблематично. Тем более, что изредка даже linux'овые решения не подходят разным веткам linux'ов =)
Так что тут просто привычка сработала: конкретизировать запросы, чтобы не копаться в ненужном — раз у Вас под linux'ом всё работает, вероятно проблема имеет какую-то особенность именно на фре =)

ps: случайно ответил не в трид, а теперь не знаю, как удалить сообщение или переместить его в нужный трид =( сорри.
Да я шучу же ж. Проблемы поиска решений под свободной бздой™ мне знакомы не понаслышке.

Не надо никуда ничего перемещать — оно и так последовательно.

xterm такое тоже поддерживает. Подозреваю, что с него и началось.

rxvt-unicode — нет.
Sign up to leave a comment.

Articles