OpenSolaris: Как подружиться с тётей Клавой

Алексей Федорчук
24 декабря 2008 г

В одной из первых своих заметок про OpenSolaris я писал, что не всё там благополучно было с вводом кириллицы. Нет, сам по себе русский как язык ввода поддерживается, как говорится, «искаропки». То есть сразу после инсталляции (при выборе в ходе её соответствующих опций)  имеются

  • локаль ru_RU.UTF-8, без малейших пережитков ISO’вщины, жалобы на которую мне доводилось слышать от опробователей просто Solaris’а;
  • набор хороших ttf-шрифтов Dejavu с поддержкой символов кириллицы (именно на соответствующие его гарнитуры указывают все alias’ы типа serif, sans и monospace);
  • русская раскладка клавиатуры и возможность переключения на неё (умолчальный переключатель — LControl+LShift);
  • индикатор текущей раскладки на одной из GNOME’вских панелей, служащий также дополнительным переключателем.

Казалось бы чего ещё желать русскоязычному (точнее, кириллопишущему) человеку, вне зависимости от его подданства и пятого пункта анкеты? Согласен, почти нечего, но:

  • раскладка клавиатуры по умолчанию — базовая Иксовая (так называемая basic Russian), совпадающая с DOS-маркировкой старых фабрично-русифицированных клавиатур; ныне изделий с такой маркировкой не найти даже в коллекциях антиквариата;
  • буква ё из этой раскладки почему-то изъята как класс — а какой же русский не любит буквы ё? кроме того, совершенно не задействованным оказался левый backslash;
  • под переключатель латиницы на кириллицу можно задействовать не все клавиши, традиционно используемые для этой цели; в частности, прикручивание этой функции к CapsLock имеет следствием эффект совершенно непредсказуемый;
  • наконец (и это самое главное), умолчальный вариант раскладки — единственно возможный; а ведь по сути своей это самая неудобная из всех раскладок, придуманных творческим гением руссифицирующего народа (все знаки препинания — на верхнем регистре).

Короче говоря, жить с такой раскладкой в пост-советской России категорически не комфортно. И когда я понял, что OpenSolaris для меня — это всерьёз и надолго, то начал искать пути к исправлению положения.

Предварительное Google’ние по теме показало, что путей таких имеется три:

  1. редактирование соответствующей секции файла /etc/X11/xorg.conf,
  2. использование утилиты setxkbmap, и наконец,
  3. детальная разборка с устройством штатного переключателя и его возможностями.

Начать я решил, разумеется, с первого способа, помятуя древний принцип, что Икс — он и в Африке who? — правильно, X, и везде через xorg.conf должен конфигурироваться более или менее одинаково. Однако если на счёт Африки, как показывает пример Ubuntu, это и верно, то за пределы Земли действие этого принципа не распространяется.

Начать с того что в свежеустановленном OpenSolaris файла /etc/X11/xorg.conf нет вообще. Действительно, современный Xorg позволяет, в принципе, запустить сам себя без всякого конфигурационного файла: тип графического чипа и характеристики видеоподсистемы определяются автоматически, управление шрифтами берёт на себя font-сервер, мыши и клавиатуры в базовой «железной» своей части одинаковы. Получается, что только для задания опций xkb он и нужен (а если, как мы увидим ниже, можно обойтись без xkb, то не нужен вообще).

Тем не менее, создать /etc/X11/xorg.conf труда не составляет. Для этого достаточно, подмазав режиссёра командой

$ su -

получить роль root’а, и дать команду

# Xorg -configure

Результатом её будет появление в каталоге /root прототипа Иксового конфига — файла xorg.conf.new с правильно (будем надеяться) определёнными базовыми параметрами — теми же самыми, которые автоматически определяются при запуске X-сервера без конфига. Остаётся только скопировать его куда следует

# cp /root/xorg.conf.new /etc/X11/xorg.conf

и отредактировать желательным образом секцию «InputDevice», которая в первозданном состоянии выглядит так:

        Identifier  "Keyboard0"
        Driver      "kbd"

Например, придать ей следующий вид:

Section "InputDevice"
	Identifier	"Keyboard1"
	Driver		"kbd"
	Option		"XkbRules"	"xorg"
	Option		"XkbModel"	"pc105"
	Option		"XkbLayout"	"us,ru"
	Option		"XkbVariant"	",winkeys"
	Option		"XkbOptions"	"grp:lwin_toggle"
EndSection

Здесь для русской раскладки используется вариант winkeys (при котором расположение клавиш совпадает с фабричной маркировкой на всех современных клавиатурах), а под переключатель латиница/кириллица задействуется левая win-клавиша — именно её я пользовал в этом качестве до начала разборок «Солнечной Клавой», ввиду невозможности задействовать ставший привычным CapsLock.

Перезагружаю X-сервер — то есть просто выхожу из сеанса пользователя, себя, любимого, и регистрируюсь в gdm по новой. На первый взгляд, всё стало почти как у Виктора Вагнера:

— Хорошо-то как, Клава…
— Да не Клава я!
— Всё равно хорошо…

Знаки препинания при русской раскладке стали вводиться в соответствие с их обозначением на клавишах, появилась столь любимая нами буква ё (правда говорят, что скоро введут йотированную б, и потребность в ней резко сократится), а левый backslash перестал генерировать нулевой символ. А после того как я скопировал свой неизменный уже ряд лет символьно-раскладочный файл path2/xkb/symbols/ru вместо оригинального /usr/X11R6/lib/X11/xkb/symbols/ru (в нём, в частности, этот самый левый backslash на нижнем регистре генерирует запятую — и какой альтернативно чудаковатый придумал поместить запятую на верхний регистр?), жизнь показалась прекрасной.

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

Во-вторых же, и главных, попытка задействовать в качестве переключателя CapsLock, к которому я привык за последние десять лет (и который исторически имеет полное право считаться наистандартнейшим из стандартных), окончилась провалом. Заменив последнюю строку предыдущего фрагмента конфига на

	Option		"XkbOptions"	"grp:caps_toggle"

завершив сеанс и попытавшись войти снова, я обнаружил что не могу ввести логин и пароль: сообщение gdm гласило, что у меня включён CapsLock, и выдавало ошибку авторизации. Благо, копия предыдущей загрузочной среды у меня имела место быть, и о возможности отката на неё я уже знал.

В результате сочетания этих двух факторов эксперимент с настройкой раскладок через xorg.conf был признан неудачным. Да и в любом случае это было бы лишь временным костылеобразным решением — уж больно оно не укладывалось в стройную системы конфигурирования OpenSolaris. Хотя способ этот годится, если надо на скорую руку подключить привычный вариант кириллической раскладки из числа стандартных для xkb (а это, если исключить base, который есть и так, — winkeys, typewriter, phonetic), не использовать «запрещенные» переключатели (пока в качестве такового я выявил лишь CapsLock) и довольствоваться индикацией текущей раскладки через светодиоды клавиатуры.

Вариант с setxkbmap я оставил на самый крайний случай полной безвыходности. Во-первых, при беглом ознакомлении с его краткой, хотя и вполне восторженной характеристикой, данной Александром Ерёминым, я с лёту не уяснил его сути — то есть требовалось вникать в него путём чтения документации. То есть делать то же самое, что пришлось бы делать и при углублённом знакомстве со штатной переключалкой. А во-вторых, у меня сложилось впечатление, что это такая же подпорка, как и прямое редактирование xorg.conf — так что я решил таки заняться более детальной разборкой третьего варианта. Благо на деле с ним оказалось всё не так страшно, как выглядело поначалу.

Для начала выяснилось, что настройка раскладок клавиатуры в OpenSolaris независима от подсистемы xkb Иксов — за неё отвечает собственная подсистема, носящая имя IIIM (Intrenet/Intarnet Input Method), точнее, её модуль IIIMF (Internet/Intranet Input Method Framework). Непосредственная же настройка осуществляется с помощью Редактора настроек способа ввода.

Вызвать этот редактор можно двумя способами:

  1. через главное «панельное» меню Система -> Параметры -> Input Methods;
  2. щелчком правой кнопкой мыши на иконке индикатора раскладок и выбором пункта Параметры из контекстного меню (рис. 1): два других пункта последнего, Справка и О программе, вызывают, соответственно, весьма подробное описание (рис. 2) и сведения о копирайтах (рис. 3) и авторах (рис. 4).

sol01Рис. 1. Вызов Редактора настроек способа ввода sol02Рис. 2. Редактор настроек способа ввода. Справка

sol03Рис. 3. О программе

 sol04Рис. 4. Авторы

В любом случае перед нами появляется панель со вкладками (рис. 5):

  • Общие;
  • Языки/Скрипты;
  • Пусковые ключи;
  • Клавиатура;
  • Разное.

sol05Рис. 5. Панель Редактора настроек способа ввода. Вкладка Общие

Во вкладке Общие для начала можно включить или отключить использование IIIMF через переключатель Включить Способ Ввода.

Далее из выпадающего меню можно определить Статус и Параметры Настройки Способа ввода. И тут надо вспомнить, что IIIM используется не только в OpenSolaris, но и в Solaris просто. Где до недавнего времени, помимо GNOME, в качестве стандартных сред использовались также CDE и JDS. Так вот, ряд настроек применим только к одной из них. У нас же речь далее пойдет только о тех параметрах, которые имеют силу в среде GNOME — единственном умолчальном десктопе OpenSolaris. Так вот, в данном случае выбирать не приходится — для него применим только пункт Использовать параметры приложения Способа Ввода. Перевод достаточно коряв, но смысл его уловить можно: значок индикатора/переключателя размещается в трее управляющей панели GNOME.

Переключатель Синхронизировать активацию Способа Ввода для всех приложений предписывает, будет ли переключение раскладки распространяться на все приложения (как это происходит в Иксах при использовании средств xkb) или только на то, в котором оно выполнено, подобно тому, как это по умолчанию принято в Windows и может быть настроено в KDE (при использовании её штатного переключателя kxkbd) и в Xfce (при использовании её штатного апплета).

Что удобнее — сквозная раскладка в сеансе или своя для отдельного приложения, каждый должен решить для себя. Я, будучи раньше твердым приверженцем первой схемы, в последнее время перешёл таки на вторую: по крайней мере, можно быть уверенным, что в окне терминала всегда включена латиница :)

Интересно, что попытка переключения раскладки при «пустом» десктопе, если на данном рабочем столе нет окон открытых приложений или все они свёрнуты, в любом случае не даст никаких результатов.

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

Переходим к вкладке Языки/Скрипты (рис. 6). Здесь в левом верхнем фрейме панели мы видим список всех доступных «языков», в правом — тех, поддержка которых включена в нашей системе. Соответственно, «языки» можно добавлять в список поддерживаемых, удалять из него, а также менять порядок в списке. На рисунке приведён сильно «прореженный» список поддерживаемых «языков» — по умолчанию их было гораздо больше.

sol06Рис. 6. Вкладка Языки/Скрипты — определение списка поддерживаемых раскладок

Почему в предыдущем абзаце слово «языки» я употребил в кавычках? Потому что это не столько языки, сколько раскладки клавиатуры для оных. Обращаем внимание, что некоторые из так называемых «языков» представлены более чем в одном экземпляре. Это обычно как раз и связано с вариантами раскладок — например, США/Английский и США/Дворак, Чешкий просто и Чешский/QWERTY. Хотя есть и локально-зависимые «языки» — например, Канадский и Канадский/Французский. Вообще, номенклатура «языков» достаточно запутана, что еще усугубляется русским переводом — вполне себе ПРОМТовским.

В нижних фреймах приведены списки так называемых engines — модулей, собственно и отвечающих за характер раскладок и переключение между ними. Впрочем, список — это громко сказано: в каждом из них лишь по одному элементу (unitle). В документации указано, что некоторые языки могут иметь более одного engine, но я пока такого не видел. Так что добавлять, удалять или тасовать тут нечего.

Активизированный в текущий момент «язык» индицируется на панели соответствующим символом, например: en — английский, ru — русский, ua — украинский. Выбрать нужный «язык» можно из списка, появляющегося по щелчку левой кнопкой мыши на индикаторе. При этом, однако, в любом случае с клавиатуры вводятся только латинские символы — почему это происходит так, мы сейчас увидим.

Вкладка Пусковые ключи — это, попросту говоря, настройка горячих клавиш или их комбинаций для переключения между раскладками. В примере (рис. 7) таковой выступает левая Win-клавиша.

sol07Рис. 7. Вкладка Пусковые ключи — установка переключения раскладок

Можно определить несколько переключателей. Для добавления нового достаточно нажать кнопку Добавить и в появившейся панельке (рис. 8) нажать желаемую клавишу или их комбинацию.

sol08Рис. 8. Определение нового переключателя

После определения клавиши-переключателя нажатие её, наконец, приводит к переключению раскладок с разными наборами символов — при этом слева от значка-индикатора языка появляется надпись Keyboard. То есть при включённых «языках» русском, английском европейском и украинском, как в примере на рис. 6, в переключенном состоянии будет осуществляться ввод символов чистой кириллицы, набора символов Latin1 и кириллицы в украинском варианте, соответственно.

Что происходит во вкладке Клавиатура — интуитивно понятно из приводимого скриншота (рис. 9): это и есть собственно выбор конкретной раскладки — того самого, что в терминологии xkb называется вариантом. С той только разницей, что здесь аналоги значений опции XkbVariant представлены самостоятельными вариантами :). Например, для американской раскладки это будут US/English и US/Dvorak.

sol09Рис. 9. Вкладка Клавиатура: выбор вариантов

К сожалению, для русской раскладки никаких вариантов, кроме базового, не предусмотрено (рис. 10). Впрочем, на эту тему я уже жаловался.

sol10Рис. 10. Вкладка Клавиатура: русская раскладка без вариантов

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

Ну а в части Разное, как обычно, начинается самый охмурёж (рис. 11). Во-первых, здесь можно включить вызов списка доступных «языков» горячими клавишами (по умолчанию — Shift+Control+Spacebar), аналогично тому, как это происходит при щелчке левой кнопкой мыши на индикаторе раскладки.

sol11 Рис. 11. Вкладка Разное

Во-вторых, можно включить циклическое переключение «языков» по комбинациям горячих клавиш: по умолчанию Shift+Control+> прокручивает их в направлении от первого до последнего по списку (см. рис.6), Shift+Control+& — в обратном порядке.

Вот, собственно, и всё, что можно настроить в интерактивном режиме Редактора настроек способа ввода: во-первых, не очень много, во-вторых, далеко не самым удобным образом, в-третьих, кое-какие возможности просто оказываются лишними. Так, выбор «языка» в полном объеме к среде GNOME вообще не применим, так что при потребности лишь в двух раскладках достаточно оставить единственный «язык» — русский, гражданам же Украины целесообразно добавить к нему украинский. Зато, если есть необходимость периодического ввода французских, немецкий, испанских, скандинавских или западнославянских вкраплений с их диакритическими знаками, все соответствующие «языки» нужно включить в список и в дальнейшем выбирать нужный из меню или циклическим перебором. А вот способа определить нециклические переключатели не обнаруживается.

Самое же главное, даже полное потрошение интерактивного Редактора настроек способа ввода ни на шаг не приблизило нас к главной цели: нахождению возможности смены варианта раскладки кириллической клавиатуры. Однако оно дало нам направление дальнейших поисков: как можно видеть на примере США, Турции и других цивилизованных стран, различные варианты раскладок в IIIM реализуются как отдельные «языки» универсального языкового инджина (unitle). И если для русского таких «языков», кроме умолчального, не предусмотрено — так что же, спасение утопающих — дело рук самих утопающих. То есть их надо создать собственноручно — говоря по-простому, изготовить подходящую раскладку клавиатуры. Остаётся только определить, как это сделать и куда её потом прикрутить.

Элементарное логическое рассуждение, доступное не только мистеру Холмсу, но и доктору Ватсону, показывает, что IIIM должен иметь некие конфигурационные файлы. И действительно, таковые находятся — как ни странно, в каталоге /etc/iiim/. Содержание его следующее:

$ ls -l /etc/iiim/
-rw-r--r-- 1 root sys    4303 2008-11-20 03:31 client.xml
-rw-r--r-- 1 root sys    1931 2008-11-20 03:31 iiimd.xml.conf
-rw-r--r-- 1 root sys  187781 2008-12-19 21:13 layoutdata.xml
-rwxr-xr-x 1 root sys     602 2008-11-20 03:31 xsession

Как нетрудно догадаться, первые три из приведенных файлов — конфиги в формате XML, последний же, имеющий бит исполнения — сценарий, обеспечивающий запуск IIIM при старте сеанса Иксов. Рассмотрение содержимого конфигов приводит к выводу, что iiimd.xml.conf нас не интересует: он отвечает за работу серверной части IIIM. Знакомство с файлом client.xml, в котором имеют место быть общие настройки клиентской части IIIM по умолчанию, также отложим до лучших времён. А вот layoutdata.xml — это как раз то что нам сейчас нужно: именно в нём находятся раскладки клавиатуры для разных «языков».

Правда, просмотреть его содержимое через обычный пейджер, например, через

$ less /etc/iiim/layoutdata.xml

будет несколько затруднительно: перед нашими глазами предстанет нечто, подобное изображённому на рис. 12.

sol12Рис. 12. Содержимое файла /etc/iiim/layoutdata.xml при просмотре в программе less

Однако вспоминаем что перед нами — обычный xml-файл, который, несмотря на отсутствие привязанной к нему таблицы стилей, можно как-то просмотреть в обычном же браузере (рис. 13).

sol13Рис. 13. Содержимое файла /etc/iiim/layoutdata.xml при просмотре в браузере

Последовательно сворачивая блоки кода, относящиеся к языкам, в данный момент не представляющим интереса, добираемся, наконец, до секции, описывающей раскладку клавиатуры для Великого и Могучего (рис. 14).

sol14Рис. 14. Файл /etc/iiim/layoutdata.xml: секция Russian

Формат записи для каждой секции файла интуитивно понятен. Сначала идёт определение «языка» в том виде, в каком оно появится во вкладке Клавиатура Редактора настроек способов ввода (см. рис. 8):

<lo alg="true" type="Russian">

Далее следует описание каждой физической клавиши, начиная с её raw скан-кода (как это именуется в терминологии xkb):

<key sym="AB01">

и генерируемых ею скан-кодов «обработанных», просто при нажатии и в сочетании с клавишами-модификаторами Shift и переключателем групп:

<c1>7a</c1> код клавиши AB01
<c2>5a</c2> код клавиши AB01+Shift
<c3>44f</c3> Mod+код клавиши AB01
<c4>42f</c4> Mod+код клавиши AB01+Shift

Дальше всё легко и просто: надо банально открыть файл layoutdata.xml в любом (или любимом) текстовом редакторе, отыскать в секции Russian key sym клавиши, коды, генерируемые которой, мы хотим изменить, и, руководствуясь Final Unicode 5.1 names list, проделать это.

Правда, на этой «просторной, дороге торной», нас будут поджидать кое-какие колдо…бины и вы…бины. Первая из них: файл /etc/iiim/layoutdata.xml записан в виде одной (и очень длинной) строки, и по нормальному отредактировать его в каком-либо штатном редакторе OpenSolaris очень затруднительно. Я, если честно, эту колдо…бину преодолел, поступившись принципами, как прихлёбный плюралист. А именно, перезагрузился во FreeBSD и спокойно отредатировал этот файл в редакторе Geany. Но, как будет видно чуть позже, то же самое можно проделать, не покидая OpenSolaris.

Вторая вы…бина — определение того, а какой же клавише на физической клавиатуре соответствует raw-код, которому мы хотим приписать новые значения скан-кодов?

Некоторое время я размышлял над этим машинально перебирая страницы вывода на поисковые запросы в Google. И в результате наткнулся на статью Хавьера Акосты (Javier Acosta) Customizing Input Methods in Solaris and OpenSolaris, который ещё до меня решал подобную проблему: преобразование одного варианта раскладки словацкой клавиатуры в другой. Правда, его задача была существенно проще — всего и требовалось, что поменять местами клавиши Y и Z. Но зато он привёл следующую картинку (рис. 15):

sol15Рис. 15. Соответствие кейкодов клавишам на клавиатуре

Заодно он предложил и способ конвертации файла layoutdata.xml в вид, пригодный для «человеческого» редактирования, с последующим возвращением его взад.

И вот теперь действительно — всё остальное дело техники и толики терпения. Можно отредактировать умолчальную (то есть базовую) раскладку, как душе угодно — изготовив из неё один из стандартных вариантов (winkeys, typewriter, phonetic). А можно, пользуясь полной свободой и легкостью процедуры, сделать раскладку своей мечты. Чем я, собственно и занялся — раньше как-то всё руки не доходили: взяв за основу базовую раскладку, перенес все знаки препинания на нижний регистр.

Я, конечно, понимаю, что голубая мечта о розовой раскладке — у каждого своя. Почему и не предлагаю результаты своих упражнений ко всеобщему использованию. Тем более, что всё равно это своего рода… ну если не костыль, а нечто вроде подпорки. И общим решением проблемы служить не может. Хотя мои личные проблемы этот способ решил полностью.

А общее решение проблемы вариантов кириллических раскладок видится мне примерно в таком ракурсе: в файле /etc/iiim/client.xml следует определит дополнительные «языки» для Великого и Могучего, и на каждый такой язык сочинить подходящую раскладку по описанному выше способу: Russian/Win, Russian/TW, Russian/Ph (названия, разумеется, чисто условные). Не очень понятно, почему этого не сделала команда русификации Solaris/OpenSolaris — видимо, русский язык они рассматривают менее значимым, нежели, скажем, турецкий. Думаю заняться этим в дни катастрофически приближающегося всенародного рождественского запоя.

А подводя итог, резюмирю базар: несмотря на непривычность и некоторую нелогичность, метод способов ввода (IIIM) с практической стороны вполне удобен. В частности, «заказные» раскладки в нём делать гораздо проще, нежели редактировать языковые файлы из каталога symbols при использовании xkd. Хотя, конечно, при этом и приходится поступаться всё тем же основополагающим принципом:

Икс — он и в Африке Ху

Надеюсь, присноблаженная Нина Андреева простит меня за столь прихлёбный плюрализм…