Прежде всего, хочу заметить, что все решения, рассмотренные в примерах, не претендуют на "правильность".
Более того, многие из них я сам считаю или излишне "корявыми" (громоздкими), или "идеологически неправильными".
Но, с другой стороны, я не предлагаю готовые решения для всех проблем, а только хочу показать - чего можно добиться простым изменением текстовых "конфигов" XKB.
Во-первых, давайте решим вопрос -
Конечно, все изменения конфигурации можно сделать непосредственно в соответствующих файлах настройки XKB. Но это очень неудобно по нескольким причинам
При этом xkbcomp позволяет легко "нанизывать" несколько файлов при описании одного компонента настройки XKB. Например, файл (блок) описания компонента xkb_types может выглядеть как
xkb_types { include "basic+pc+мои_типы+еще_один_полезный_тип"; };Что означает -
При этом, если в добавляемом файле встретится определение для какого-то элемента, уже описанного в предыдущих файлах, новое определение, обычно, замещает старое, не затрагивая все остальные определения.
Итак. Давайте все изменения/исправления/дополнения помещать в отдельных файлах и просто "приплюсовывать" эти файла к уже имеющимся.
Хотя, в некоторых случаях (особенно это касается добавлений в xkb_symbols), боле эффективным может оказаться не "приплюсовывание", а объявление добавляемого файла отдельной инструкцией - replace.
Напомню, что "плюсик" в инструкции include означает, что инструкции из
файла будут добавляться в режиме override (см "Способ добавления".). А при
переопределении клавиш часто требуется способ replace.
Поэтому, при добавлении в xkb_symbols, вместо одного длинного include
лучше использовать конструкцию типа
xkb_symbols { include "en_US(pc104)" replace "my.symbols" replace "one_another_symbol" };
Теперь осталось решить вопрос - куда "приплюсовывать"?
Во-первых, напомню, что программа xkbcomp может "на ходу" поменять настройки
XKB прямо в работающем X-сервере. Для этого вторым ее аргументом ("куда")
нужно указать "X дисплей". Если вы работаете на той же машине, где и
запущен X-сервер, то это выглядит как
xkbcomp ... :0.0(можно еще проще - ":0")
А вот первым аргументом должен быть файл с описанием одного или нескольких компонентов настройки. Для того, чтобы одной командой загружать все необходимые компоненты настройки, давайте сначала составим файл с полным описанием всех компонентов, соответствующий вашей текущей конфигурации.
Это совсем не сложно, но зависит от того - какой способ задания полной
конфигурации используется у вас в XF86Config (см. "Настройка XKB")
(Надеюсь, что у вас используется один из способов "в чистом виде", а не
"каша" из всех возможных инструкций).
Если у вас используется первый способ - перечислением необходимых компонентов (keycodes, types, compat, symbols, geometry).
Просто скопируем из файла XF86Config все инструкции типа Xkb**** из секции
"Keyboard" в наш файл. И слегка подправим.
Например, у вас там написано
XkbKeycodes "xfree86" XkbTypes "default" XkbCompat "default" XkbSymbols "us(pc104)+ru" XkbGeometry "pc(pc104)"Надо -
xkb_keymap { Xkb_Keycodes { include "xfree86" }; Xkb_Types { include "default" }; Xkb_Compat { include "default" }; Xkb_Symbols { include "us(pc104)+ru" }; Xkb_Geometry { include "pc(pc104)" }; };
Это и есть полное описание настройки XKB. Которое можно загружать в X-сервер, программой xkbcomp.
Все наши добавки мы можем "приплюсовывать" в соответствующие строчки этого описания.
Если у вас используется второй способ - указание полной keymap. В этом случае надо просто найти конкретную keymap и скопировать в наш файл.
Например, у вас в XGF86Config есть только строчка
XkbKeymap "xfree86(ru)"Она указывает на то, что полное описание лежит в файле {XKBROOT}/keymap/xfree86, в блоке "ru".
Находим этот файл. Находим в нем блок
xkb_keymap "ru" { .... };И "выкусываем" его оттуда. (Поскольку в нашем файле только один блок, название блока можно убрать).
Больше никаких исправлений не требуется.
Если у вас используется третий способ - через задание "правил", "модели", "схемы".
В этом случае все немного сложнее, поскольку непосредственно xkbcomp не понимает этот способ.
Однако, в этом случае можно "вручную" выполнить преобразование
правил/модели/схемы в компоненты настройки (keycodes,symbols и т.п.).
Например, у вас в файле конфигурации написано
XkbRules "xfree86" XkbModel "pc104" XkbLayout "ru" XkbOptions "grp:shift_toggle"
Сначала надо найти файл "правил" (rules). Это будет файл {XKBROOT}/rules/xfree86.
В первой секции, которая после "шаблона"
! model = keycodes geometryпо вашей модели - "pc104" находим название файлов (блоков) для xkb_keycodes и xkb_geometry. Скорее всего это будет
xkb_keycodes - "xfree86" xkb_geometry - "pc(104)"
Теперь, во второй секции, после "шаблона"
! model layout = symbolsнайдем по "модели" - "pc104" и "схеме" - "ru" подходящий файл для xkb_symbols.
Скорее всего, схема "ru" там не упомянута. Но зато есть правило
pc104 * = en_US(pc104)+%l%(v)где %l надо "заместить" названием "схемы" (layout), а %(v) - названием "варианта".
xkb_symbols - "en_US(pc104)+ru"
Следующая секция, после "шаблона"
! model layout = compat typesвообще очень простая
* * = complete completeТо есть, независимо от конкретных значений model и layout, и xkb_compat, и xkb_types надо брать из файлов "complete".
xkb_types - "complete" xkb_compat - "complete"
И, наконец, последняя секция, после "шаблона"
! option = symbolsуказывает, что для нашей "опции" - grp:shift_toggle, к уже выбранному файлу для xkb_symbols надо "приплюсовать" еще и блок "group(shift_toggle)"
Теперь не забудьте добавить слова include, скобки в нужном месте и "обрамление" xkb_keymap { ... };
Должно получится
xkb_keymap { xkb_keycodes { include "xfree86" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "us(pc104)+ru+group(shift_toggle)" }; xkb_geometry { include "pc(pc104)" }; };Это и есть наша рабочая "полная конфигурация", к которой можно писать "добавки" - исправления/дополнения.
Наконец, надо заметить, что делать все это (и полное описание и фалы-добавки) вы можете в отдельной директории, поскольку xkbcomp при "разборке" include сначала ищет файла в текущей директории, а только потом в "стандартном" месте - {XROOT}/lib/X11/xkb. Естественно, подразумевается, что мы при экспериментах запускаем xkbcomp, находясь в этой директории.
А вот потом, если вы решите, что "это хорошо", можно будет разложить файлы с исправлениями в соответствующие поддиректории (keycodes, types, symbols и т.д ) "домашней директории" XKB - {XROOT}/lib/X11/xkb. И подправить файл конфигурации X-сервера так, чтобы он при старте загрузил вашу конфигурацию.
Иван Паскаль [email protected]