Стандартная финская раскладка клавиатуры сильно отличается от английской. При переключении добавляется несколько нужных букв с умляутами, но сдвигаются многие знаки препинания (например, скобки съезжают с 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