Next Previous Contents

3. Настройка текстовой моды

Вообще, настройка текстовых режимов - самый простой способ показывать и вводить символы кириллицы.

Ниже я опишу способ, как "справиться" с драйвером Linux консоли. Поэтому, если вы пытаетесь русифицировать консоль в другой системе, то не ожидайте, что описанные приемы будут там работать. Взамен проконсультируйтесь с руководством по драйверу терминала и пошлите мне любую информацию, которую вы найдете. В этом случае я смогу включить это в дальнейшие версии этого документа.

Для специфической информации касающейся вашего дистрибутива вам следует обратиться в раздел Кириллизация дистрибутивов.

3.1 Консольный драйвер Linux

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

Чтобы настроить консоль, вы можете воспользоваться одним из двух описанных ниже пакетов: console-tools (См. раздел consoletools) или kbd (См. раздел kbd).

В ранних версиях Linux альтернативы kbd нет, но в свежих дистрибутивах вместо kbd сейчас модно использовать пакет consoletools. Этот пакет кардинально отличается от пакета kbd (например в нем нет команды setfont - для совместимости используется эмулирующий скрипт).

Чтобы проверить что же вашей системе установлено надо попробовать выполнить команду consolechars? Если она успешно выполнилась тогда у вас есть пакет console-tools, еже ли нет, то у вас скорее всего имеется команда setfont и значит инсталлирован пакет kbd.

Немного теории

Вам будет полезно знать общую схему работы консольного драйвера. Когда некоторая пользовательская программа запрашивает консольный драйвер вывести на экран символ имеющий код А, то консольный драйвер сначала ищет код А в так называемый Application Charset Map (ACM). Отсюда он узнает какой код Б согласно кодировки Unicode соответствует коду А. Вы определяете используемую вами кодировку посредством ACM. Далее консольный драйвер ищет код Б в Screen Font Map (SFM). Таблица SFM определяет кодировку используемого шрифта подобно тому как ACM определяет вашу кодировку. От SFM консольный драйвер узнает какой символ активного шрифта имеет код Б согласно Unicode и нужно вывести на экран.

Существуют две важные модификации этой схемы.

Аппаратные ограничения современных компьютеров не позволяют использовать шрифты имеющие более 512 символов. Отсюда очевидно, что иногда консольному драйверу будет невозможно найти код Б в SFM. Тогда ему на помощь приходит, так называемая, fallback таблица. Эта таблица определяет для кода Б возможные его аппроксимации Б1, Б2,... Например если Б является код символа "левая двойная угловая кавычка", то возможно Б1 будет код символа "левая одинарная угловая кавычка", а Б2 будет просто код символа "<". Другое часто используемое применение fallback таблицы является аппроксимация псевдографических символах посредством других. Например если используемый шрифт не имеет псевдографических символах и вы скажете консольному драйверу использовать таблицу graph.fallback, то он начнет чертить окна подобно следующей картинке:

+==================.
|   Главное меню   |
+------------------+
| 1. текст         |
| 2. графика       |
.==================.

На экране это выглядит не так уж и плохо.

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

Возможно у вас теперь появился следующий вопрос: а почему нужна вся эта сложная процедура? Что если я использую шрифты имеющие ту же самую используемую мною кодировку? Это возможно, но возникают некоторые осложнения. Вам нужно сказать программам, что псевдографические символы в шрифте уже находятся на других местах. И даже если вы ухитритесь сделать это посредством специального терминального типа (как напр. linux-koi8r), то появится вторая (уже неразрешимая) проблема -- из-за аппаратных свойств VGA, горизонтальная псевдографика получится с разрывами, если символы псевдографики в шрифте не расположены на тех же позициях, что и в кодировке cp437. Из распространенных кириллических кодировках псевдографика cp866 идентична с псевдографикой cp437. Поэтому рекомендуется использовать шрифты имеющие кодировку на основе cp866.

Прежде чем приступить к деле мы расскажем немного и о 8-битовой screen map. Не всегда консольный драйвер Linux умел работать с Unicode. Конечно тогда не существовали также и ACM и SFM. Вместо них использовался 8-битовый screen map (таблица перекодировки). Она представляет из себя просто таблицу для перевода от одной кодировки (используемая программами) в другую (шрифта). Например koi2alt.trans переводит коды KOI8-R в коды cp866. Для совместимости, теперь 8-битовый screen map эмулируется посредством специальным видом ACM.

Установка кириллицы с помощью пакетов console-tools и kbd обычно состоит из:

  1. Настройки экранного шрифта и SFM. Это делается с помощью программы consolechars (пакет console-tools) или setfont и mapscrn (пакет kbd).
  2. Настройки ACM (или 8-битового screen map) и fallback-таблицы.
  3. Загрузки соответствующей раскладки клавиатуры с помощью программы loadkeys.

ЗАМЕЧАНИЕ: В старых версиях запуск программы setfont под X-Windows мог завесить систему. Сейчас в этом случае печатается сообщение об ошибке.

Большинство дистрибутивах позволяет устанавливать кириллицу по умолчанию во время загрузки. Как это делается описано в другом разделе этого HOWTO.

Файлы шрифтов обычно находятся в /usr/share/consolefonts или /usr/lib/kbd/consolefonts, таблицы ACM, SFM и fallback в /usr/share/consoletrans, клавиатурные раскладки в /usr/share/keymap/i386/qwerty.

Ниже перечислены команды, которые устанавливают русскую клавиатурную раскладку и работу с KOI8-R. Вы увидите, что мы не используем SFM и fallback-таблицы, а вместо ACM используем 8-битовый screen map. Это в основном из за того, что имеющиеся в kbd и console-tools шрифты для cp866 не снабжены с SFM. Если вы хотите воспользоваться всеми возможностями консольного драйвера Linux и радоваться хорошим шрифтам, то используйте пакет console-tools-cyrillic Виктора Вагнера..

consoletools

Сам пакет можно найти по адресу console-tools.

В случае, если ваш дистрибутив использует пакет consoletools сделайте примерно так:

foo="/место/где/лежат/ваши/консольные/шрифты"
loadkeys $foo/ru.map
consolechars -v -f $foo/Cyr_a8x16 -m $foo/koi2alt

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

К сожалению шрифты и клавиатурные раскладки поставляемые вместе с этими пакетами не позволяют воспользоваться всеми возможностями консольного драйвера. Поэтому я рекомендую вам использовать пакет console-tools-cyrillic Виктора Вагнера.

kbd

Довольно много дистрибутивов Linux устанавливают kbd как обязательную часть системы. Сам пакет доступен по адресу http://sunsite.unc.edu/pub/Linux/system/Keyboards/.

Пакет kbd содержит утилиты управления клавиатурой, кроме этого, с ним поставляется широкий выбор шрифтов и раскладок.

Установка кириллицы с помощью kbd обычно состоит из:

  1. Загрузки соответствующей раскладки клавиатуры с помощью программы loadkeys. Практически в каждом дистрибутиве можно установить раскладку клавиатуры, которую система загружает по умолчанию во время загрузки, с помощью соответствующей программы настройки (например для Redhat это /usr/sbin/kbdconfig). Вы также можете просто запустить loadkeys из вашего ~/.profile или сделать это руками.
  2. Настройки экранного шрифта. Это делается с помощью программы setfont. Файлы шрифтов находятся в /usr/lib/kbd/consolefonts. ВНИМАНИЕ: В старых версиях Linux запуск программы setfont под X-Window мог завесить систему. Сейчас в этом случае печатается сообщение об ошибке.

Если вы являетесь приверженцем программ, выполняемых в текстовой моде и использующих достоинства PC псевдографики (таких как Midnight Commander), вы можете предпочесть использовать шрифты с Alt кодировкой и консольной раскладкой (console character map). Это означает, что ваша консоль отображает Alt шрифты, но все кириллические символы, соответствующие KOI-8R кодировки, соответственным образом отображаются в Alt и поэтому выглядят правильно. Преимущество этого метода заключается в том, что он позволяет использовать псевдографические символы Alt кодировки.

Ниже перечислены команды, которые позволяют достичь этого эффекта.

loadkeys /usr/lib/kbd/keytables/ru.map
setfont /usr/lib/kbd/consolefonts/Cyr_a8x16
mapscrn /usr/lib/kbd/consoletrans/koi2alt
# ниже идет магическая последовательность
echo -ne "\033(K"

При русификации всех консолей при загрузке системы вместо строчки

echo -ne "\033(K"

следует использовать строчку

for i in 1 2 3 4 5 6 7; do echo -ne "\033(K" > /dev/tty$i; done

- это русифицирует все терминалы

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

Проверка правильности кириллизации консоли

Теперь вы, вероятно, хотите проверить правильность кириллизации консоли.

Сконфигурируйте соответствующим образом bash или tcsh (этот шаг необходим), перегрузите его, затем нажмите правую клавишу Control. Удостоверитесь, что вы можете печатать на русском правильно. Клавиша 'q' должна соответствовать "й", 'w' соответствует "ц", и т.д.

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

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

loadkeys /usr/lib/kbd/keytables/defkeymap.map
setfont /usr/lib/kbd/consolefonts/default8x16

ВНИМАНИЕ: В старых версиях Linux консольный драйвер не способен сохранить это состояние, когда передается управление X-Window. Следовательно, после того, как вы вышли из X (или переключаетесь на консоль), вы должны перезагрузить русский шрифт.

Что делать, если "слетела" консоль?

Скорее всего на консоль был скопирован какой-то двоичный файл, где случайно встретилась переключающая ESC-последовательность. Тогда:

Сброс терминала :

$ echo -ne "\033c"

набрать вслепую, или с работающей консоли:

# echo -ne "\033c" >/dev/ttyX

Переключение на downloaded font

$ echo -ne "\033(K"

(возможно, еще придется перегрузить фонты, но это смотря как консоль сорвало...)

Если вывалилась какая-то программа, которая использует curses, то проще

$ stty sane

В Red Hat все это делают reset; setsysfont <ctrl-j>

reset - из ncurses

См. 'man console_codes' и 'man stty'


Next Previous Contents