Рассмотрим подробнее в чем заключается процесс русификации syscons. Еще раз напомню, что все основные настройки syscons делаются автоматически при старте системы. Вам необходимо только правильно указать параметры в файле /etc/rc.conf.
Итак, инструкция (FreeBSD Handbook) предлагает добавить в rc.conf строчки:
keymap=ru.koi8-r keychange="61 ^[[K" scrnmap=koi8-r2cp866 font8x16=cp866b-8x16 font8x14=cp866-8x14 font8x8=cp866-8x8
Начнем с последних строчек:
font8x16=cp866b-8x16 font8x14=cp866-8x14 font8x8=cp866-8x8
Они определяют аргументы для утилиты vidcontrol, которая должна будет загрузить в видео-контроллер новый набор шрифтов (подробнее в описании vidcontrol). Почему рекомендуют шрифты cp866, хотя русификация FreeBSD подразумевает кодировку koi8-r, немного позднее.
Напомню, что для стандартного режима "режима отображения" (25 строк) необходим только шрифт с матрицей 8x16. Остальные два понадобятся только в том случае, если вы будете использовать другие режимы (30, 43, 50 строк).
Кстати, если вы заглянете в /usr/share/syscons/fonts, то обнаружите, что шрифты в кодировке cp866 для матрицы 8x16 имеют три варианта - cp866, cp866b и cp866c (такой же набор имеется и для кодировки koi8-r). Причем, cp866 и cp866c немного отличается набором символов - в cp866c часть символов "псевдографики" заменена "экзотическими" буквами. А вот cp866b сильно отличается внешним видом символов, причем и программа инсталляции и большинство руководств по русификации усиленно навязывают именно его. (Мне, например, он не нравится, но это дело вкуса).
Строчка - "scrnmap=koi8-r2cp866" опять же задает аргумент для vidcontrol, но уже не для установки шрифтов, а для загрузки в syscons таблицы перекодировки (screenmap). Поскольку, шрифты рекомендуется поставить для кодировки cp866, то для того, чтобы тексты в кодировке koi8-r отображались правильно, необходима эта таблица - "из koi8-r в cp866".
Возникает вопрос - почему нельзя поставить шрифты сразу для кодов koi8-r и обойтись без какой-либо screenmap?
На самом деле - можно. Можно поставить шрифты для koi8-r, тем более, что в наборе шрифтов они есть и для всех трех матриц (а для 8x16, даже в нескольких вариантах - koi8-r, koi8-rb, koi8-rc).
Тогда соответствующие строчки в rc.conf будут выглядеть
scrnmap="NO" font8x16=koi8-r-8x16 font8x14=koi8-r-8x14 font8x8=koi8-r-8x8
Однако, не торопитесь это делать. Дело в том, что шрифты cp866 лучше подходят для видеокарты "писишки".
Каждый символ на экране рисуется
в матрице шириной в 9 точек, при этом
"перерисовать" (загружая
шрифты) можно только 8 из них.
Девятая колонка служит для того,
чтобы символы, если они даже
полностью занимают все восемь
"программируемых" колонок,
все-таки не сливались между собой. С
другой стороны есть такие символы
псевдографики, которые
предназначены для рисования
рамочек и просто горизонтальных
линий. Для них, наоборот,
желательно, чтобы они сливались,
иначе горизонтальные линии будут
выглядеть пунктирными.
Видео-контроллер, учитывает это и
отрисовывает девятую колонку
по-разному. Для обычных символов
эта колонка остается пустой
(независимо от содержимого
остальных восьми колонок), а для
псевдографических - девятая
колонка точек просто повторяет
восьмую.
Проблема в том, что
видео-контроллер имеет свое мнение
о том, какие символы являются
псевдографическими (и,
следовательно, должны сливаться в
сплошную линию), а какие - нет.
Псевдографическими он считает
символы с кодами в диапазоне C0 - DF.
Так вот, в шрифтах cp866
"псевдографика" действительно
попадает в этот диапазон (и
горизонтальные линии рисуются
слитно), а в koi8-r - нет (и те же линии
рисуются пунктиром).
Другая проблема при
использовании шрифтов koi8-r может
возникнуть, если вы захотите
включить поддержку "мыши" в
syscons.
Дело в том, что для отрисовки
графического курсора syscons
перепрограммирует шрифты для
четырех символов (коды D0 - D3). В
шрифтах cp866 эти коды попадают на
псевдографические символы (причем,
редко используемые), а в koi8-r - на
буквы "п я р с". Естественно,
если вы используете шрифты koi8-r, при
"мышевождении" эти буквы на
экране портятся.
Правда, эта проблема имеет и другое решение. В последних версиях syscons, коды, используемые под "мышиный" курсор, можно изменить, пересобрав ядро системы.
Поэтому, тот же "FreeBSD Handbook" советует для русификации первым делом пересобрать ядро, добавив в файл конфигурации
option "SC_MOUSE_CHAR=0x03"
Хороший совет, если не обращать внимание на то, что сама по себе пересборка ядра - задача более сложная (и требует значительно больше времени), чем правка пары строк в rc.conf. (Кстати, и 0x03 - не очень удачная замена).
Вот эти причины и делают более предпочтительными шрифты cp866, хотя эффект от них чисто косметический.
Первая строчка - "keymap=ru.koi8-r"
служит аргументом для утилиты kbdcontrol,
которая при старте системы
загрузит в syscons "раскладку
клавиатуры" ru.koi8-r.
Это раскладка с "альтернативной
клавиатурой", в которой
"буквенные" клавиши
генерируют коды русских букв в
соответствии с кодировкой koi8-r.
Естественно, в этой раскладке
предусмотрен модификатор для
переключения между основной и
"альтернативной"
клавиатурами. Он
"подвешивается" на клавишу [CapsLock].
Если вам это не нравится, вы можете
подправить сам файл "раскладки
клавиатуры" (смотри пример Переключатель
"альтернативной клавиатуры"
(Рус/Лат).).
Кстати, если пересобрать ядро с "option RUKEYMAP", то эта раскладка будет "встроена" в syscons "по умолчанию". В этом случае, ее можно не загружать при старте системы.
А вот следующая строчка
keychange="61 ^[[K"
имеет к русификации косвенное отношение.
Дело в том, что загружая новые шрифты, мы меняем свойства терминала. По крайней мере, символы псевдографики перемещаются другой диапазон кодов. Следовательно, описание терминала cons25 в termcap уже не будет полностью соответствовать реальным свойствам syscons. Поэтому, для русифицированного syscons в том же termcap предусмотрено другое описание и, соответственно, другой тип терминала - cons25r. Именно поэтому, те же инструкции по русификации рекомендуют подправить файл /etc/ttys (исправить все cons25 на cons25r) чтобы на каждом виртуальном терминале при старте очередной сессии переменная окружения TERM (которая и сообщает программам тип терминала) по умолчанию получала значение cons25r.
Но описание терминала cons25r отличается от cons25 не только символами псевдографики. Согласно этому описанию, клавиша fkey61 (кнопка [Delete]) должна при нажатии выдавать последовательность кодов "Esc [ K", а не код 177, как это делает syscons (и как указано в описании терминала cons25).
Поэтому, нам рекомендуется "подрегулировать" сам syscons, чтобы его поведение соответствовало описанию в termcap. (Почему нельзя исправить termcap и оставить syscons в покое, я не знаю).
Итак, эта строчка служит только для "подгонки" syscons к его новому описанию в termcap. Она представляет из себя аргумент для программы kbdcontrol, которая заменит для клавиши fkey61 ([Delete]) выдаваемый код.
Рассмотренные рекомендации подразумевают, что вы будете использовать русскую кодировку koi8-r.
Как вы наверное знаете, существует по крайней мере еще две не менее популярные кодировки для русских букв cp866 и cp1251.
Можно ли заставить syscons (и дисплей, и клавиатуру) правильно работать с такими кодировками? Конечно, можно.
Как вы уже поняли, для дисплея необходимо загрузить соответствующие шрифты или screenmap, а для клавиатуры - таблицу "раскладки клавиатуры".
Кстати, для cp866 в системе уже есть все необходимое. То, что есть шрифты cp866 вы уже знаете (только надо убрать дополнительную перекодировку через screenmap), подходящая "раскладка клавиатуры" - ru.cp866, также имеется в /usr/share/syscons/keymaps.
А вот если вы хотите cp1251, то кое-что придется изготовить самостоятельно (или попросить у тех, кто уже сделал). Надо составить "раскладку клавиатуры" (назвать ее, например - ru.cp1251), а для дисплея проще всего делать не новые шрифты, а screenmap. Если у вас используются шрифты cp866, то надо просто изготовить табличку из 256 байт, которая будет транслировать коды из cp1251 в cp866 (пусть она называется - cp1251-cp866) и "подсунуть" ее syscons.
Если вы хотите во время работы переключаться между различными кодировками, надо сделать три командных файла и запускать их в нужный момент.
Например, если не трогать шрифты (пусть это будут шрифты для cp866) и "перенастройку" дисплея делать с помощью screenmap, то эти файлы могут выглядеть так:
kbdcontrol -l ru.cp866 vidcontrol -L
kbdcontrol -l ru.koi8-r vidcontrol -l koi8-r2cp866
kbdcontrol -l ru.cp1251 vidcontrol -l cp1251-cp866
Напомню только, что и шрифты, и "таблица перекодировки", и "раскладка клавиатуры" действуют на все виртуальные терминалы. Поэтому установить для разных терминалов разные "типы русификации" не получится.
И, наконец, надо заметить, что русификация драйвера терминала, хотя и важная часть русификации всей системы, но не единственная.
Если вы хотите, чтобы все программы нормально понимали русский язык в кодировках отличных от koi8-r, вам придется еще менять переменную окружения LANG (а возможно и некоторые другие). А для cp1251 еще и изготовить "locale" (набор таблиц, описывающих особенности национального языка). Кроме того, некоторые программы (например, чтения/писания почты) возможно придется "отконфигурировать" индивидуально.
Но, для того, чтобы "по быстрому" просмотреть или подправить какой-нибудь документ в "нестандартной" кодировке, скорее всего "сойдет" и описанное решение.
Иван Паскаль pascal@tsu.ru