ru en
.. ....... НовостиNews - ПоискSearch - ТекстыTexts - ФотоPhotos - КартыMaps - СнаряжениеEquipment - LTLT

Настройка en-ru-fi клавиатуры в X11Setting en-ru-fi keyboard in X11
19 апреля 202519 Apr 2025

Стандартная финская раскладка клавиатуры сильно отличается от английской. При переключении добавляется несколько нужных букв с умляутами, но сдвигаются многие знаки препинания (например, скобки съезжают с 9 и 0 на 8 и 9, кроме того, в раскладке используется три регистра с двумя переключателями (shift и правый alt). В результате мне не хочется делать полноценное переключение на эту непривычную раскладку, а хочется добавить нужные буквы на обычную английскую.

Решение, которое мне нравится: сделать три раскладки, английскую, русскую и еще одну английскую. На вторую английскую раскладку добавляются нужные мне финские буквы. Переключать первую и вторую раскладку по правому Alt (я их использую чаще всего), а первую и третью - по правому Win.

Такое можно легко сделать с помощью команд setxkbmap и xmodmap (см. скрипт ниже) и прописать эти команды к себе в .xsession. Но этого не достаточно. Сложность в том, что драйвер клавиатуры в X-сервере (evdev) тоже может и хочет настраивать раскладку клавиатуры. То есть, есть некоторая "системная раскладка", которую можно настроить в разделе InputClass в xorg.conf, которая будет предлагаться всем пользователям на этапе введа пароля. Тут я хочу иметь что-то стандартное, например англо-русскую c привычным переключателем (можно ли там добавить отдельные финские буквы, не правя пакет xkeyboard-config - я, кстати, не знаю).

Но при отключении и включении клавиатуры раскладка будет сбрасывается и настраивается драйвером. Пользовательская раскладка при этом теряется. Я решаю эту проблему следующим образом:

Ну и еще я использую xxkb, чтоб раскладка переключалась для каждого окна отдельно, а в углу окна показывался значок en/ru/fi:

~/etc/kbd_set - настройка пользовательской en-ru-fi раскладки:


#!/bin/sh
setxkbmap -layout "" -option ""  # clear old things!
setxkbmap -v -layout "us,ru(common),us" -option "grp:toggle"

# add Finnish letters:
xmodmap -e 'keycode 34 = bracketleft  braceleft  Cyrillic_ha       Cyrillic_HA       aring Aring'
xmodmap -e 'keycode 35 = bracketright braceright Cyrillic_hardsign Cyrillic_HARDSIGN oslash Oslash'
xmodmap -e 'keycode 47 = semicolon    colon      Cyrillic_zhe      Cyrillic_ZHE      odiaeresis Odiaeresis'
xmodmap -e 'keycode 48 = apostrophe   quotedbl   Cyrillic_e        Cyrillic_E        adiaeresis Adiaeresis'
xmodmap -e 'keycode 51 = backslash    bar        backslash         bar               ae AE'
# Two switches: RightAlt for RU-EN, right Win for EN-FI
xmodmap -e 'keycode 108 = ISO_Next_Group Meta_R  ISO_First_Group Meta_R ISO_First_Group Meta_R'
xmodmap -e 'keycode 134 = ISO_Prev_Group Meta_R  ISO_Next_Group Meta_R ISO_Next_Group Meta_R'

~/etc/kbd_keeper - установка раскладки при перетыкании клавиатуры:


#!/bin/sh
while true; do
  inotifywait -q -e create /dev/input/by-id
  ~/etc/kbd_set
  sleep 1
done

~/.xsession - запуск скриптов в начале сессии:


...
~/etc/kbd_set
~/etc/kbd_keeper &
...

/etc/X11/xorg.conf - настройка системной раскладки:


...
Section "InputClass"
    Identifier "keyboard defaults"
    MatchIsKeyboard "on"
    Option "XkbModel" "pc104"
    Option "XkbLayout" "us,ru(common)"
    Option "XKbOptions" "grp:toggle"
    Option "GrabDevice" "True"
EndSection