- dylon / .bash_profile
- Разукрашиваем вывод в консоли: теория и практика
- Управляющие последовательности ANSI
- 8 основных цветов и стили
- Возможные аргументы
- Бонус: другие интересные модификаторы, которые могут поддерживаться не всеми платформами
- Часто используемые сочетания (copy-paste-able)
- Больше цветов: аж целых 256
- Совсем много цветов
- Python: Использование библиотеки Colorama
- А что не так с Windows?
- Termcolor
- Выводы
- Источники
- 256 цветов в терминале ⇒ уровень nightmare
- Цвета в xterm
- Как цвет-то получить?
- Зачем это все?
- Цвета терминала Linux
- Раскрашиваем цвета вывода ls
- Раскрашиваем и изменяем строку приглашения:
dylon / .bash_profile
# . |
# This is for what I would consider a standard setup, where TTY’s 1 — 6 are |
# «linux» terminals and TTY’s 7+ are reserved for X windows. You should adjust |
# it to your setup, accordingly. |
# |
# . Important . You must have both fbterm and screen installed and on your |
# path for this to work. |
virtual_terminal= » $( tty | grep -oE . $ ) « |
case » $virtual_terminal » in |
tty1|tty2|tty3|tty4|tty5|tty6) |
exec fbterm — bash -c ‘ TERM=fbterm screen ‘ |
;; |
esac |
# I had an issue invoking `TERM=fbterm screen` with `fbterm` directly — it |
# seems to want the actual command to invoke as the first parameter (rather than |
# an environment variable). I worked around it by using `bash -c`; you may use |
# whatever shell you want, or may even be able to figure out how to invoke |
# `TERM=fbterm screen` directly. |
# |
# To get the 256 color mode to work correctly, invoking `screen` with |
# `TERM=fbterm` is necessary. It wouldn’t work correctly simply exporting the |
# variable before or after invoking `screen`. |
# |
# This is what the official fbterm documentation says about 256 color mode: |
# |
# xterm has a 256 color mode extension, FbTerm also add it in this version. But |
# xterm’s 256 color escape sequences conflict with the linux sequences |
# implemented by FbTerm, so private escape sequences were introduced to support |
# this feature: |
# |
# ESC [ 1 ; n > set foreground color to n (0 — 255) |
# ESC [ 2 ; n > set background color to n (0 — 255) |
# ESC [ 3 ; n ; r ; g ; b > set color n to (r, g, b) , n, r, g, b all in (0 — 255) |
# |
# and a new terminfo database entry named «fbterm» was added to use these |
# private sequences, all program based on terminfo should work with it. By |
# default, FbTerm sets environment variable «TERM» to value «linux», you need |
# run «TERM=fbterm /path/to/program» to enable 256 color mode. |
# . |
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник
Разукрашиваем вывод в консоли: теория и практика
Консоль привлекает многих своей минималистичностью и эстетикой, но даже в ней иногда хочется выделить определённый фрагмент, чтобы показать его роль или значимость. Например, отметить зелёным текстом сообщение об успешном выполнении операции или обозначить длинный текст ошибки курсивом. О том, как это делать, а также о реализации на питоне — читайте далее.
Управляющие последовательности ANSI
ANSI escape sequences или Управляющие последовательности ANSI — это стандарт, дающий возможность управлять курсором, цветами, начертание в текстовых консолях. Такие последовательности воспринимаются отрисовщиком терминала, как команды отображать последующий текст в определенном формате. Есть также последовательность, которая сбрасывает предыдущие команды, и отображение текста становиться обычным. Существует несколько форматов управляющих последовательностей, различающихся возможностями и появившимися в разных версиях кодировок. Поговорим об этих форматах подробнее.
8 основных цветов и стили
Для обычного пользователя разнообразия цветов этого формата будет более чем исчерпывающим. Но прежде чем задумываться о том, что терракотовый цвет гораздо круче красного, и он вам уж точно нужен, давайте разберемся, как устроена самая простая версия управляющей последовательности ANSI для форматирования текста.
Чтобы изменить текущий цвет шрифта или фона можно использовать следущий синтаксис:
- Начинается управляющая последовательность с любого из этих трёх представлений: \x1b[ (hex) или \u001b[ (Unicode) или \033[ (oct)
- Далее следуют аргументы, разделённые между собой ; (можно указывать в любом порядке)
- В конце ставится буква m
Возможные аргументы
Модификатор | Код |
---|---|
1 | Жирный |
2 | Блеклый |
3 | Курсив |
4 | Подчёркнутый |
5 | Мигание |
9 | Зачёркнутый |
Изменения цвета шрифта
Цвет | Код |
---|---|
30 | Чёрный |
31 | Красный |
32 | Зелёный |
33 | Жёлтый |
34 | Синий |
35 | Фиолетовый |
36 | Бирюзовый |
37 | Белый |
Изменения цвета фона
Цвет | Код |
---|---|
40 | Чёрный |
41 | Красный |
42 | Зелёный |
43 | Жёлтый |
44 | Синий |
45 | Фиолетовый |
46 | Бирюзовый |
47 | Белый |
Бонус: другие интересные модификаторы, которые могут поддерживаться не всеми платформами
Модификатор | Код |
---|---|
38 | RGB цвет (см. раздел «Совсем много цветов») |
21 | Двойное подчёркивание |
51 | Обрамлённый |
52 | Окружённый |
53 | Надчёркнутый |
Пример корректного синтаксиса: \033[3;36;44m . После вывода этой конструкции стиль будет изменён для всего последующего текста. Чтобы вернуться к изначальному состоянию можно использовать \033[0m , тогда весь текст с этого места вернётся к изначальному форматированию.
Давайте поэкспементируем. Для примеров я буду использовать Python.
Важно заметить, что форматирование повлияло и на консоль питона, а не только на ее вывод. Именно поэтому очень важно закрывать все «тэги» изменения форматирования.
Часто используемые сочетания (copy-paste-able)
Код | Описание |
---|---|
\033[0m | вернуться к начальному стилю |
\033[31m \033[0m | красный текст — для обозначения ошибок |
\033[1;31m \033[0m | жирный красный текст — для обозначения критических ошибок |
\033[32m \033[0m | зеленый текст — успешное выполнение |
\033[3;31m \033[0m | красный курсив — текст ошибки |
\033[43m \033[0m | выделение основного, как будто жёлтым маркером |
Больше цветов: аж целых 256
Некоторые терминалы поддерживают вывод целых 256 цветов. Если команда echo $TERM выводит xterm-256color , то ваш терминал всё корректно обработает.
В этом формате синтаксис немного другой:
Для генерации кодов цветов можно использовать генератор.
А палитру доступных цветов можно увидеть на картинке ниже.
Совсем много цветов
Этот формат не всегда поддерживается стандартными консолями.
Некотрые будут негодовать: «256 цветов и нет моего любимого терракотового, какой ужас!». Для таких ценителей существует формат, который уже поддерживает 24 битные цвета (3 канала RGB по 256 градаций).
Для не ценителей поясню, что терракотовый кодируется как — (201, 100, 59) или #c9643b.
Синтаксис в этом формате выглядит вот так:
Python: Использование библиотеки Colorama
Библиотека Colorama позволяет форматировать текст, не запоминая коды цветов. Рассмотрим её использование на примере:
Style позволяет изменить стиль, Fore — цвет шрифта, Back — цвет фона. Использовать переменные из colorama нужно также, как и коды изменения стиля. Но плюс использования библиотеки в том, что Fore.RED более читаем, чем \033[0;31m
Если в colorama.init() указать параметр autoreset=True , то стиль будет автоматически сбрасываться (в конец каждого print будут добавлены сбрасывающие стили последовательности), поэтому вам не придётся об этом каждый раз вспоминать.
А что не так с Windows?
Просто так синтаксис, описанный в начале статьи, не работает в командной строке Windows. Поддержка цветов появлялась постепенно, причём в странном варианте. В начале программы надо сделать системный вызов, активирующий отрисовку цветов. А в более старых версиях необходимо заменить все ANSI последовательности на системные вызовы.
Но colorama.init() сделает всё за вас в большинстве версий Windows. Однако если вы используете другую операционную систему, то функцию init() вызывать в начале программы не обязательно. Также некоторые IDE на Windows (например, PyCharm) тоже поддерживают цвета без каких-либо махинаций.
А еще Windows не поддерживает многие модификаторы, такие как жирный текст. Подробнее можно почитать на странице Colorama
Termcolor
Ещё одна библиотека для вывода цветного текста с более удачным, на мой взлгяд, синтаксисом.
Кстати, проблему с Windows всё ещё можно починить с помощью colorama.init()
Выводы
Стандартные 8 цветов позволяют разнообразить вывод в консоль и расставить акценты. 256 цветов намного расширяют возможности, хотя и поддерживаются не всеми консолями. Windows, к сожалению, не поддерживает многие основные модификаторы, например, курсив. Также есть некоторые цвета, которые не прописаны в стандартах, но могут поддерживаться вашей операционной системой. Если вы хотите больше цветов, то вы можете поискать их в Гугле.
Пока что не любой терминал поддерживает 24-битные цвета и все модификаторы, но мы вряд ли увидим сильные изменения в этой сфере. Так что пока нам остаётся выбирать самые красивые варианты из тех, что доступны в любимом терминале.
Источники
Облачные серверы от Маклауд быстрые и безопасные.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!
Источник
256 цветов в терминале ⇒ уровень nightmare
Я тут строю некоторый велосипед с длинным отладочным выводом в stdout и меня взволновал вопрос серьезной расцветки лога. Современные терминалы xterm умеют и любят 256 цветов, но вот люди, которые придумывали escape-последовательности для этой палитры, стреноженные обратной совместимостью и латентной склонностью к криптографической эмпирике, все сделали так, что у меня ушло несколько часов, чтобы со всем этим разобраться. Интернет тоже не изобилует подробными разъяснениями, как оно там устроено.
Вкратце, текст в иксовый терминал можно нынче выводить кучеряво. Я набросал некое подобие сервиса, типа визивига для генерации escape-последовательностей. Выбрал цвета, начертание шрифта — получи набор закорючек. Тех же, кому интересны потроха — прошу под кат.
Цвета в xterm
Чтобы терминал понимал, что он может показать 256 цветов, ему надо об этом сказать:
Сам цвет кодируется совершенно умопомрачительным образом. Escape-последовательность, начинающаяся традиционно с « \e[ » и заканчивающаяся « m », состоит из флагов, цвета фона и цвета текста. Флаги для жирного, наклонного, подчеркнутого и инверсного ( fg⇐⇒bg ): 01, 03, 04, 07 соответственно (есть еще флаг для мигающего, но вдруг меня читают дети?). Флаги отмены этих стилей: 22, 23, 24, 27. Флаги можно записывать один за другим через точку с запятой, перед заключительной «m» точка с запятой не ставится.
Цвет текста имеет сигнатуру (пардон) 38;05; ЦВЕТ;. Цвет фона — 48;05; ЦВЕТ;. ЦВЕТ здесь — это ∀ целое число ∈ [1, 255]. Первые шестнадцать — хорошо нам знакомые старые терминальные цвета, последние 24 — градации серого, остальные — ну это остальные.
Вот как-то так (за картинку спасибо федоре):
Легко увидеть, что последовательность « \e[01;04;38;05;196;48;05;232m » включит режим жирного подчеркнутого красного на черном фоне.
Как цвет-то получить?
Цвета, оказывается, кодируются в оставшиеся 256 - 16 — 24 = 216 вариантов простым и понятным алгоритмом: градации rgb калибруются на шесть и цифра получается как RGB в шестиричной системе счисления, с «нулем в шестнадцати» (для #ff9900 это даст 16 + 5 * 6² + 3 * 6 + 0 = 214 ). Есть и исключения, как же без них. Те самые «стандартные» 16 цветов и градации серого. Ага.
Зачем это все?
Ну, во-первых, мне было любопытно. Во-вторых, три часа — не деньги. В-третьих, у меня теперь мой лог-файл так переливается, что выцепить что-нибудь взглядом стало еще сложнее. Ну и PS1 , конечно, переписан с нуля.
В общем, если вам нужна escape-последовательность для конкретного цвета — вот вам WYSIWYG. Если кому-то зачем-то нужен оффлайн — @github.
Источник
Цвета терминала Linux
Одно из главных преимуществ Linux заключается в том, что при желании в нём можно настроить всё, что угодно. В этом и выражается преимущество проективных систем, над процедурными. Фактически, это конструктор, состоящий из отдельных блоков, каждый из которых можно настроить по своему желанию.
Особенно интересно, если не просто копируешь чужой «рецепт», а пытаешься разобраться, что и как устроено. И даже решая несерьезную задачу, узнаешь что-то новое.
Раскрашиваем цвета вывода ls
Как-то захотелось мне настроить цвета терминала linux в выводе команды ls. Ну не нравился блекло-фиолетовый цвет для каталогов в Linux Mint. Начал разбираться.
Из документации к ls, выяснил, что установка цветов для вывода осуществляется при помощи утилиты dircolors, которая либо устанавливает параметры цвета из своей собственной базы, либо берет их из файла
/.dircolors. Такого файла в моем домашнем каталоге не было. Также упоминалось, что инициализация использования цветов происходит через
/.bashrc, файл с настройками командной оболочки, а сами параметры определяются через переменную LC_COLORS.
Действительно, в .bashrc обнаружился скрипт следующего содержания:
Его суть сводится к проверке на наличие утилиты dircolors в системе, присваивания значения переменной и, при удачном выполнении, использовании параметра —color=auto при каждом вызове ls.
Если запустить утилиту dircolors, она выводит значение переменной LC_COLOR.
Также возможен вывод значения переменной LC_COLORS в структурированном виде, указанием ключа:
Поскольку вывод получается длинный, приводить его не буду.
Если перенаправить вывод dircolors -p >
/.dircolors, то будет создан структурированный файл, из которого и будут браться настройки цветов. Редактируя данный файл и устанавливаются настройки цвета для вывода ls.
В созданном файле .dircolors есть подсказка:
Устанавливая последовательность через точку с запятой и получаем нужный нам цвет в консоли linux, согласно перечисленным. Цвета терминала linux от 30 до 37 для цвета шрифта, а с 40 до 47 для фона. К примеру:
DIR 01;34 подразумевает, что имена директорий будут выделяться жирным шрифтом и синим цветом.
Но таким способом получается всего восемь цветов, а современные эмуляторы терминала способны выводить как минимум 256! Выяснилось, что существуют и другие способы установки цвета. К примеру, значение EXEC 38;5;208;1 — даёт оранжевый толстый шрифт у исполняемых файлов.
Чтобы не перебирать цвета linux вручную, есть уже готовая таблица цветов:
Подставляя в значение цвета 38;5;x — где x цвет из таблицы, получаем необходимый результат. Получается что-то вроде этого:
Но как это работает? Дело в том, что установка цвета вывода информации в эмуляторе терминала осуществляется при помощи ANSI escape-кодов. Это определенная последовательность символов, которая не выводится на экран, однако влияет на вывод. Называется она так, поскольку начинается с \033[ — кода «Esc». Поскольку терминалов и эмуляторов терминалов существует множество, эти управляющие коды стандартизированы. Управлением цветом через последовательность от 30 до 37 — это стандарт ECMA-48. Информация о нем содержится в разделе console_codes. А управление через 38;5;* — определено стандартом T.416. Более подробная информация есть, конечно же, в Википедии.
Раскрашиваем и изменяем строку приглашения:
Разобравшись, как устанавливать цвета linux через esc-коды, не составит труда переделать и раскрасить строку приглашения. За ее вывод отвечает переменная PS1, которая определена в файле
В Linux Mint скрипт ее инициализации имеет следующий вид:
То-есть сперва определяется, запустил ли скрипт root или обычный пользователь. Поскольку в подавляющем большинстве случаев имеет место именно второй вариант, то и редактировать нужно строку, следующую после первого ‘else’. Формат строки расшифрован в документации по баш, в разделе «Promting». Из него следует, что esc-последовательность должна начинаться с «\[» и заканчиваться «\]». Таким образом:
- [\033[01;32m\] — устанавливает зеленый цвет;
- \u — выводит имя пользователя;
- \h — выводит имя хоста;
- [\033[00m\] — очищает установленные атрибуты;
- [\033[01;34m\] — устанавливает синий цвет;
- \w — выводит имя рабочей директории;
- Привет! — пример того, что может быть выведен любой производный текст.
Что ещё можно вывести в строке приглашения:
- \d — дату, в формате «Wed Dec 28»;
- \A — время в 24-часовом формате;
- \! — номер текущей команды в истории;
- \n — перенос вывода на другую строку;
Введем что нибудь поинтереснее:
И строка приглашения примет вид:
Так, не понял, а откуда взялась ёлка-то?
Ну ладно, на самом деле, если в конец .bashrc вставить echo -e «С Новым годом», то поздравление будет выводиться при каждом запуске терминала перед приглашением ввода. Соответственно, вывод можно раскрашивать каким угодно способом. А там уж и ёлку нарисовать не сложно.
Источник