Заметки о Linux-консоли
6. Украшение консоли

Алексей Федорчук
[email protected]

По мне так текстовая консоль Linux прекрасна сама по себе, в первозданном виде по умолчанию: белые или светло-серые буквы на радикально черном фоне строги, но элегантны. Разумеется, при одном непременном условии - выборе подходящего шрифта.

Кажется, одна из причин того, что многие пользователи пренебрегают консольным режимом, именно в шрифтах и кроется. Действительно, тот, с позволения сказать, шрифт, который обычно устанавливается в консоли по умолчанию при ее кириллизации, - отнюдь не верх эстетического совершенства. Однако ограничиваться "умолчальным" шрифтом никто не заставляет.

Благо, экранных шрифтов для консоли в современных Linux-дистрибутивах обычно много. В этом можно убедиться, просмотрев каталог типа /usr/share/kbd/consolefonts или тот, где они содержатся в конкретном дистрибутиве (точное местоположение легко определить командой find со значением consolefonts для опции -name). Вывод команды ls для этого каталога займет уж точно пару экранов. И шрифтовые файлы, которые в нем можно увидеть, обычно (хотя и не обязательно) имеют вид *.psf.gz (то есть использующие сигнатуру psf и сжатые утилитой компрессии gzip, хотя последнее не всегда применяется).

Правда, как легко догадаться, далеко не все эти шрифты содержат символы кириллицы. Однако и таких обнаружится десятка три. Если нет - их легко позаимствовать (прямым копирование в должный каталог) из любого Linux-дистрибутива отчественного производства (типа Altlinux или ASPLinux). Или - из пакета console-tools-cyrillic, собранного и периодически обновляемого Виктором Вагнером.

Полная коллекция кириллических экранных шрифтов включает наборы для всех традиционных кодировок Великого и Могучего, получивших распространение на родных просторах - DOS, Windows, KOI8, ISO8859, которые опознаются по именам шрифтовых файлов. Шрифты в DOS-кодировке имеют имена типа alt*, Cyr*, cp866* или просто 866* (имена одних и тех же шрифтов в разных дистрибутивах могут варьировать; хотя в принципе шрифты с префиксами alt и Cyr несколько различаются по наборам символов). Шрифты KOI8 (как R, так и U) именуются прозрачно - koi8r и koi8u, соответственно. Шрифты для Win-кодировки имеют в своем имени слово win или цифры 1251. ISO'шные шрифты опознаются по символам iso5 или слову sun (поскольку именно на Sparc'ах главным образом и используются).

По причинам, которые будут рассмотрены в заметке о русификации, практическое значение для экранного вывода в наших условиях имеют почти исключительно шрифты для кодировки DOS. Вне зависимости от того, как их называют, в любом дистрибутиве Linux (за исключением уж совсем американских) можно обнаружить минимум три таких "гарнитуры" (если этот термин в данном случае уместен), именуемые как-нибудь вроде cp866*, cp866-b* и cp866-c*. Они несколько отличаются своим обликом и расположением некоторых редко используемых специальных символов. Впрочем, все три внешне выглядят вполне скверно (особенно при плотности символов, отличной от стандартной).

В отечественных дистрибутивах (и в пакете console-tools-cyrillic) можно найти еще несколько кириллических шрифтов для DOS-кодировки. Например, alt-antiq, стилизованный под старину, или t866, имеющий как бы рукописный облик. Однако и они не вполне подходят для постоянного использования (хотя могут придать вашей консоли вполне оригинальный вид).

И потому очень рекомендую обратить внимание на семейство шрифтов UniCyr*. Среди них можно обнаружить как курьерообразные разновидности, так и вполне честные шрифты Sans Serife (а на мой взгляд, именно шрифты без засечек наиболее подходят для экранного вывода в консоли). Таковых - два, UniCyr-lenta-8x16 и UniCyr-sans-8x16. Их дополнительное достоинство - слабая подверженность деформации при нестандартной плотности символов (напомню, что в консоли мы всегда имеем дело с растровыми шрифтами, и потому их искажение при масштабировании неизбежно). Впрочем, на вкус и цвет товарищей нет, и потому подходящий шрифт каждый может выбрать для себя методом ползучего эпмиризма.

С некоторого времени в дистрибутивах Linux, претендующих на интернациональность, можно видеть шрифты вида *.psfu.gz или *.psfu. Таким образом можно опознать шрифты в кодировке Unicode (хотя не все они имеют суффикс psfu), содержащие наборы символов для разных алфавитов и кодировок. Так, практически всегда можно обнаружить семейство гарнитур, именуемое LatArCyrHeb-* (с высотами матрицы 8, 14, 16 и 19 пикселей). Как легко понять из названия, любой из них пригоден для вывода на экран символов латиницы, кириллицы, арабского и еврейского алфавитов, нужно только указать, какого точно (как - скажу чуть ниже).

Для смены экранного шрифта в текущем сеансе работы служит команда setfont из пакета kbd (в пакете console-tools ей соовтетствует команда consolechars). Дается она с указанием имени шрифта в качестве аргумента, например:

$ setfont UniCyr-sans

что приводит к мгновенной смене экранного шрифта на всех виртуальных консолях. Если шрифты расположены в стандартном для данного дистрибутива каталоге (например, /usr/share/kbd/consolefonts), не требуется ни указания полного пути к имени шрифтового файла, ни его суффикса (вида *.psf.gz). Необходимость и в том, и в другом возникнет, если шрифты берутся из необычного места (например, домашнего каталога пользователя).

В команде consolechars загружаемый шрифт значением опции -f, каковое подчиняется тем же правилам, что и аргумент команды setfont.

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

Первое - если после исполнения команды setfont имя_шрифта вместо русского текста на экране наблюдаются всякого рода безобразия, команду следует повторит в виде

$ setfont UniCyr-sans -m koi2alt

где значение опции -m указывает на имя mapscreen. В особо тяжелых случаях (при нерусифицированной системе, или системе, русифицированной некорректно, а также при открытии новой виртуальной консоли в соответствии с ранее описанными методами), возможно, придется этот самый mapscreen еще и активизировать вручную вводом т.н. "магической последовательности"

$ echo -ne '(K'

Если загружаемый шрифт относится к категории юникодовских, опуия -m потребуется в любом случае, и значением ее должно быть koi8-r_to_uni, например:

$ setfont LatArCyrHeb-16 -m koi8-r_to_uni

При этом необходимости в выводе "магической последовательности" не возникнет (более того, делать это не следует). Единственное, что может потребоваться для нормального восприятия ранее выведенного кириллического текста - так это обновление экрана (во многих программах для этого служит клавишная комбинация Control+R).

Наконец, если принято решение использовать для вывода шрифты в кодировке KOI8, отпадает требование не только вывода "магической последовательности", но и опции -m в команде setfont. Оно и понятно - ведь в этом случае и для ввода, и для вывода используется один и тот же набор символов.

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

В клонах Red Hat, наколько я помню, это достигается изменением значения строки SYSFONT в конфигурационном файле /etc/sysconfig/i18n. В других дистрибутивах "умолчальный" шрифт может изменяться в других конфигах из каталога /etc и его подкаталогов - сверяйтесь с документацией. А в почти любых неясных случаях самое место для подгрузки шрифта - файл /etc/rc.local, куда можно поместить строку вида

setfont UniCyr-sans -m koi2alt

Не забыв сопроводить ее сценарием инициализации mapscreen на всех открываемых при старте витруальных консолях, о чем подробно будет сказано в заметке о русификации.

Теоретически рассуждая, шрифт, загружаемый по умолчанию, можно вкомпилировать в ядро системы (во FreeBSD такая возможность предусмотрена в штатной документации). Преимущество этого метода - доступ к кириллическим шрифтам при всякого рода аварийных загрузках (например, при подмене штатного процесса init командной оболочкой путем передачи ядру параметра init=/bin/shell_name). Это позволит для исполнения ремонтно-спасательных действий прибегнуть к подсказкам из русскоязычной документации. Однако сам я такую процедуру не проделывал. Могу только предполагать, что она потребует изменения исходников файлов типа /usr/src/linux/drivers/char/console*. За любые соображения по сему предмету буду благодарен.

На мой взгляд, подбора подходящего шрифта довольно для придания консоли презентабельного вида. Однако при желании можно заняться и ее расцвечиванием (хотя, повторяю, монохромный стиль консоли столь же естественен, как и черно-белая гамма козинцевского "Короля Лира").

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

Для изменения цветовой гаммы используется неоднократно поминавшаяся ранее команда setterm (из пакета ulil-linux), для чего в ней имеются опции -foreground [цвет] и -background [цвет], изменяющие цвет текста и фона, соответственно. Значения обеих задаваются в 8-цветной палитре - black, blue, green, cyan, red, magenta, yellow. Кроме того, с помощью опции -reverce можно поменять цвет текста и фона, сделать текст мигающим (посредством опции -blink), выделенным (с опцией -bold) или, наоборот, "приглушенным" (с опцией -half-bright). Все опции, определенные для команды setterm (подробности см. в man (1) setterm), имеют силу только для текущей виртуальной консоли (почему цвет и используется для их различения; хотя, на мой взгляд, это проще и эффективнее сделать средствами командной оболочки zsh).

При манипуляциях с цветом консоли следует иметь ввиду следующие обстоятельства. Во-первых, реальное воплощение цветовых значений на экране зависит от монитора и (или) видеокарты, и может быть весьма неожиданным. И, определив для опции -foreground значение yellow, можно спокойно получить темно-горчичный цвет на черном фоне, что отнюдь не способствует читабельности текста.

Во-вторых, развитые командные оболочки имеют собственные средства манипуляции цветами, которые (для /bin/bash, например) задействуются по умолчанию во многих дистрибутивах. А сочетание изменений цветов через setterm и командную оболочку может привести к совершенно непредсказуемым эффектам, вплоть до полной нечитаемости текста.

И в третьих, многие программы (например, всенародно любимый Midnight Commander) сами по себе изменяют свойства терминала, сбивая настройки setterm после выхода из них. Чтобы этого не происходило, команду setterm следует давать с дополнительной опцией -store, сохраняющей в качестве умолчаний уставновленный ею набор терминальных атрибутов.

Тем не менее, если результаты цветовых экспериментов показались удачными, измененные цвета фона и текста можно сделать постоянными. Для этого достаточно включить команду setterm с требуемыми значениями опций в один из стартовых файлов (например, в тот же /etc/sysconfig/i18n в Red Hat клонах или в /etc/rc.local - во многих дистрибутивах, использующих BSD-стиль инициализации).

И последнее, что я хотел бы сказать о цветах. Консольный драйвер FreeBSD (syscons) позволяет менять цвет не только текста и фона, но и бордюра экрана отдельно для каждой виртуальной консоли. Что такое бордюр, помнят, пожалуй, только пользователи старых четырнадцатидюймовиков без средств цифрового управления: это та самая черно-серая кайма между изображением пластмассой окаемки дисплея. В старых DOS-русификаторах, помнится, изменение ее цвета использовалось для индикации текущей раскладки клавиатуры (латиницы или кириллицы). Однако на любом современном мониторе бордюр обычно сводят под ноль. Тем не менее, и его можно использовать в мирных целях (например, придав бордюру root-консоли тревожный красный цвет).

В Linux'е штатного средства для этого не имеется. Однако на сайте винницкой фирмы Крон я обнаружил патч к ядру, как будто бы позволяющий менять цвет бордюра аналогично тому, как это делается во FreeBSD. К сожалению, патч этот предназначен для достаточно старой версии ядра, и в современных ядрах работосопособность его гарантировать нельзя.

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