Хабрахабр

[Из песочницы] Ввод текста в Linux (ibus)

Если ваша клавиатура размечена под латиницу или кириллицу, а вам приходится набирать тексты на другом языке, особенно, используя сложные, неалфавитные письменности, то данная заметка о системах ввода в Linux (упрощенно "клавиатурных раскладках") может вас заинтересовать.

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

Методы ввода

XKB предназначен для работы с алфавитными письменностями, и не может обслуживать комплексные письменности типа китайских иероглифов или силлабариев Индии и Африки. Основным методом ввода символов (input method, IM) в Linux является XKB, он установлен по умолчанию и активируется сразу после установки операционной системы. Последнее ограничение можно обойти, повесив на горячие клавиши вызов команды с нужной комбинацией параметров для каждого языка. Систему можно настроить на работу с не более чем 4 раскладками.

Основные представители подобных систем в Linux: IBus, SCIM, Fcitx. Если требуется большая гибкость, то следует перейти к фреймворкам (input method framework). Из опыта использования IBus и Fcitx могу сказать, что обе системы поддерживают примерно равное количество плагинов. Сам по себе фреймворк текст вводить не умеет, а различные письменности должны подключаться в виде плагинов (engines). Например, метод ввода Pinyin для китайского языка реализован в виде самостоятельной библиотеки libpinyin и при подключении через IBus или Fcitx предоставляет идентичные возможности. Зачастую, это могут быть практически одни и те же плагины.

Далее я перечислю основные плагины IBus, как более знакомой мне системы. Можно считать, что за последние 6-7 лет разница между фреймворками нивелировалась, хотя какие-то особенности могут проявляться.

Единственная проблема в том, что IBus не умеет динамически генерировать конфигурации XKB. Во-первых, IBus способен прозрачно использовать xkb и все его возможности. (При обновлении IBus файл будет заменён на стандартный.) Наиболее популярные из них заранее прописаны в файле /usr/share/ibus/component/simple.xml, который можно изменять и дополнять по необходимости.

Например, русская раскладка описана следующим образом:

<engine> <name>xkb:ru::rus</name> <language>ru</language> <license>GPL</license> <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author> <layout>ru</layout> <longname>Russian</longname> <description>Russian</description> <icon>ibus-keyboard</icon> <rank>99</rank>
</engine>

Чтобы обойти это ограничение или просто создать раскладку под свои задачи, её нужно полностью описать. В дополнение к layout можно указать layout_variant, остальные параметры setxkbmap недоступны, в том числе и известная типографская раскладка Ильи Бирмана, которая задаётся в xkb через аргумент misc:typo. Например, русская с дополнениями Ильи Бирмана: Для этого, в папке /usr/share/X11/xkb/symbols нужно создать файл custom (если дополнять существующие файлы, то при обновлении системы они будут затёрты) и задать конфигурацию раскладки.

partial alphanumeric_keys
xkb_symbols "ru-typo" ; // "~"
};

Соответственно, из файла "ru" берётся вариант русской раскладки "winkeys". Где строки include собирают конфигурацию из готовых шаблонов. файл "level3"), что аналогично команде: Потом дополняется раскладкой "base" из файла "typo" и задаётся переключатель третьего слоя AltGr (см.

setxkbmap -layout ru -variant winkeys -option lv3:ralt_switch,misc:typo

В приведённом выше примере знак ударения "U+0301" (Combining Acute Accent) вынесен на сочетание AltGr+~. При желании, можно внести собственные изменения. Позиции, в которых указано NoSymbol, используют определения из предыдущих шаблонов: "ё" и "Ё" из "winkeys", "≈" из "typo":

key <TLDE> { [ Cyrillic_io, Cyrillic_IO, NoSymbol, NoSymbol ] }; // winkeys
key <TLDE> { [ NoSymbol, NoSymbol, NoSymbol, approxeq ] }; // typo
key <TLDE> { [ NoSymbol, NoSymbol, U0301, NoSymbol ] }; // custom

Далее, созданную раскладку нужно внести в файл /usr/share/ibus/component/simple.xml в следующем виде:

<engine> <name>xkb:ru:typo:rus</name> <language>ru</language> <layout>custom,us</layout> <layout_variant>ru-typo,</layout_variant> <longname>Russian (with Typo)</longname> <description>Russian (with Typo)</description> <icon>ibus-keyboard</icon> <rank>1</rank>
</engine>

Дополнительная раскладка us указана, чтобы корректно работали горячие клавиши (Ctrl+С, Ctrl+V и т.п.). Где custom — имя файла из папки /usr/share/X11/xkb/symbols, а ru-typo указывает на содержащуюся в нём раскладку. После перезагрузки IBus (ibus restart) в настройках появится новая раскладка "Russian (with Typo)".

Это довольно богатая библиотека клавиатурных раскладок для разнообразных письменностей. Второй метод ввода — m17n. Мне приходилось использовать последний для создания раскладки с однозначным соответствием между латинскими буквами и буквами требуемого алфавита без задействования сложно логики, поэтому я не могу судить, какая из двух систем более функциональная и выразительная — описание раскладки в формате m17n или ibus-table. IBus имеет собственный схожий метод ввода ibus-table, который описан как обладающий "чуть меньшими возможностями". Метод ibus-table включает в себя любопытную раскладку "LaTeX" для ввода символов в соответствующей нотации: "\Delta" для "Δ", "\ge" для "≥" и т.д.

Это Linuх-версия метода ввода Keyman для Windows. Следующий из универсальных методов ввода — KMFL. В отличие от оригинального Keyman, с заявленной возможностью печатать на более чем 1000 письменностях, KMFL не настолько развит, но тоже может быть полезен. Не очень распространённый IM, который поддерживает самые редкие письменности. Я использую раскладку EuroLatin, в которой текст "2//3" преобразуется в дробь "⅔", а последовательность "-a" превращается в макрон "ā". Формат описания раскладок текстовый, существует программа для их создания под Ms Windows. Напоминает Compose key в xkb, но не требует отдельного модификатора — KMFL сам распознает последовательности во время набора.

Настройки этих плагинов также находятся в /usr/share/ibus/component/. Остальные методы ввода специализируются на отдельных письменностях: "ibus-libpinyin" для китайского языка, "ibus-unikey" для вьетнамского и т.д. Например, в libpinyin.xml нужно найти параметр "layout" и вписать "us" для клавиатуры QWERTY или "fr" для AZERTY и т.п. В соответствующих файлах может потребоваться задать базовую раскладку клавиатуры, иначе при переключении с нелатинской раскладки они будут нерабочими.

<layout>us</layout>

Переключение раскладок

Поэтому предпочитаю иметь одну горячую клавишу для переключения между двумя последними раскладками (CapsLock), а на сами раскладки переключаются по отдельным горячим клавишам (Win + 1…9 на цифровом блоке). Большую часть времени я работаю с языковыми парами: русский-английский, китайский-испанский и т.п. Таким образом, сначала я задаю рабочие раскладки, Win+1 (en) и Win+2 (ru), а далее переключаюсь между ними по CapsLock (en <-> ru).

Так же можно выбирать нужную раскладку через консоль и, соответственно, назначить скрипт на горячую клавишу. В IBus можно задать две горячих клавиши: одна для циклического переключения по списку раскладок, вторая для последних двух раскладок.

Поэтому я предпочитаю через udev глобально переопределять CapsLock как F14 (файл /etc/udev/hwdb.d/90-custom-keyboard.hwdb): Замечу, что переназначить CapsLock с помощью xmodmap не получится, так как IBus сбрасывает подобные настройки.

evdev:input:b0003v1A2Cp0E24* # my keyboard id
KEYBOARD_KEY_70039=f14 # bind capslock to f14

По моему опыту это обеспечивает наиболее стабильную конфигурацию. И использовать уже F14 как горячую клавишу в IBus.

Виртуальная клавиатура

Ни в Армении, ни в Грузии вы не сможете купить клавиатуру с клавишами, подписанными буквами национальных алфавитов. Промышленно выпускаются клавиатуры, размеченные под определённую письменность, лишь для языков с большим количеством пользователей — например, для русского (ЙЦУКЕН). Аналогично, в Казахстане и Узбекистане используют русско-английские клавиатуры и вынуждены учить, где располагаются буквы, не входящие в стандартную латиницу или кириллицу.

Мне нравитcя Onboard, потому что она самостоятельно подстраивается под активную раскладку и обновляется при переключении на другую. Если вы осваиваете новую раскладку, советую воспользоваться виртуальной клавиатурой. Но это работает только с xkb (также при использовании xkb через IBus).

Onboard очень удобна для тестирования раскладок xkb и позволяет посмотреть назначенные символы на всех слоях (AltGr и т.п.).

Заключение

В частности, Sublime Text 3 работает лишь со SCIM, а используя IBus, независимо от выбранной раскладки, будет печатать исключительно латинские буквы. Не все программы корректно поддерживают языковые фреймворки.

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

Китайские интернет-маркеты предлагают накладки (保护膜 или 键盘膜) для Apple Magic Keyboard под самые различные письменности. Ещё одно подспорье для работы с разнообразными письменностями — силиконовые накладки на клавиатуру. Но учтите, что выпускалось три поколения Apple Magic (и каждая в модификациях для США, Европы и Японии), а китайские реплики отличаются линейными размерами и расположением клавиш. Пример некитайского дистрибьютора. Временами, я сожалению, что не существует единого стандарта на компьютерные клавиатуры.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть