Pull to refresh

Тонкая настройка клавиатуры и языков в «Линуксе»

Наверное у всех нас за время работы с компьютером накапливается определенный набор бредовых желаний, которые, бывает, засядут в голове и сидят там до тех пор пока не будут выполнены. И тогда особый, ни с чем не сравнимый зуд, заставляет нас вновь и вновь продлевать свою членскую карточку в клубе «Пила и бубен». Благо, «Линукс» — та система, в которой любая настройка может быть осуществлена; да еще и тысячью разных способов. И сегодня мой рассказ будет о том, как я настраивал клавиатуру на вновь приобретенном нетбуке «Эйч-пи мини». И да, «настраивал» здесь — это эвфемизм к словам «реализовывал полный спектр своих странных требований».


Нужно иметь ввиду

Итак, есть несколько вещей, о которых лучше упомянуть, прежде чем вы твердо решите потратить свое драгоценное время на прочтение этого топика.
  1. Я — пользователь «Арча». Это такой дистрибутив «Линукса». Соответственно, всё что я буду описывать в данной статье апробировалось и работает в приведенном виде только на нем.
  2. Я — пользователь «и3». Это такой мозаичный (тайловый) оконный менеджер. У пользователей ДЕ могут возникнуть проблемы при попытках повторения у себя описываемых в этой статье манипуляций. Давайте решать вместе.
  3. Эта статья — не ман. Эта статья — хауту. Здесь будет мало теории и много (относительно) примеров. Из примеров вы сможете собрать свои команды и конфигурации, с шахматами и пианистками. Делающие то, что нужно вам.


Типографские соглашения.

В этом топике приняты следующие соглашения по выделению информации:
  • Выделение вводимых пользователем команд осуществляется следующим образом:
    $ echo Команда выполненная обычным пользователем
    # echo Команда выполненная суперпользователем

  • Выделение частей конфигурационных файлов осуществляется аналогичным предыдущему способом.
  • Названия приложений и сервисов выделены курсивом, например xxkb.
  • Пути выделены жирным шрифтом, например, /urs/share/каталог/, или /urs/share/каталог/файл.


Цель

Сразу обозначу что мне было нужно, чтобы было ясно, что́ мы будем делать. Я хотел:
  1. Две раскладки: английскую и привычную русскую.
  2. Смену раскладок по нажатию «Капса».
  3. Типографскую раскладку по зажатию правого Альта.
  4. Светящийся индикатор «Капса» при включенной русской раскладке.
  5. Индикатор текущей раскладки в виде флага на каждом открытом окне.
  6. Чтобы новые окна открывались с английской раскладкой.
  7. Чтобы старые окна сохраняли свою раскладку независимо от переключения раскладок в других окнах.
  8. Функция «Делит» на правом Контроле (привык к «Делиту» справа внизу, на моем нетбуке он расположен сверху).
  9. Функция «Инцерт» на клавише «Делит» (той, которая справа сверху).
  10. Функции «Хом», «Энд», «Пэйдждаун» и «Пэйджап» на клавишах курсора при зажатом правом Альте (на клавиатурах нетбука Эйч-пи Мини 210-ой серии соответствующих кнопок нет ).
  11. Эмуляция правого мышиного клика по нажатию клавиши Меню.
  12. Эмуляция среднего мышиного клика по нажатию правый Альт + Меню.


Настройка раскладок

Есть три варианта настроек раскладок клавиатуры в «Иксах». Рассмотрим их в том порядке, в котором они будут читаться системой: сперва читаются правила, записанные в xml-файле из /etc/X11/xorg.conf.d/, затем исполняется команда setxkbmap из какого-нибудь init-скрипта (например, ~/.xinitrc) или вашим приложением автозапуска (в этом случае она будет выполняться последней), и наконец, читаются настройки, заданные в ГУИ-приложении которое отвечает за параметры клавиатуры. Сразу стоит отметить, что каждый последующий уровень так или иначе сбивает настройки предыдущего. Следует также отметить, что демон gdm в своем конфигурационном файле /etc/gdm/Xsession имеет строки, содержащие команду setxkbmap, и при переключении пользователей также будет сбивать настройки. Проще всего не пользоваться этим демоном или выпилить соответствующие строки из конфига. Кстати, ГНОМовские параметры клавиатуры тоже всего лишь формируют свою команду setxkbmap, которую затем и исполняют. Причем нажатие на кнопочку «параметры по умолчанию» просто выполнит ее per se, без всяких ключей, что как ни странно, не собьет существующих параметров, заданных setxkbmap или в xml-файле, но испортит настройки, заданные с помощью команды xmodmap из ~/.xinitrc (решается добавлением команд xmodmap в автозапуск; выше я уже отметил, что он исполняется последним).

Настройка /etc/X11/xorg.conf.d/10-keyboard.conf

Вот как содержимое этого файла выглядит у меня:
Section "InputClass"
Identifier "evdev keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
Option "XkbModel" "pc104"
Option "XkbLayout" "us,ru(winkeys)"
Option "XkbOptions" "grp:caps_toggle,terminate:ctrl_alt_bksp,grp_led:caps,lv3:ralt_switch,misc:typo"
EndSection


Опциями задается модель клавиатуры, две раскладки — английскую и привычную русскую, переключение по нажатию клавиши «Капс», прерывание работы Иксов по нажатию сочетания клавиш Контроль, Альт и «Бэкспейс». Также здесь задается свечение индикатора «Капса» при включенной русской раскладке и переключение на третий уровень правым Альтом. На третьем уровне висит типографская раскладка «typo». В строку опций «XkbOptions» можно включить также «grp:rwin_switch», для временного переключение раскладки при зажатой левой клавише Супер. Вы можете захотеть назначить переключения на другие клавиши, вот примеры: shifts — два «Шифта», alt_shift — Альт + «Шифт», ctrl_shift — Контроль + «Шифт», et cetera. Чтобы при включении русской раскладки загорался индикатор «Скролла», — укажите «grp_led:scroll» вместо «grp_led:caps».

setxkbmap

Еще раз, — этот способ является альтернативным первому. Конечно, он может использоваться и вместе с ним (не знаю зачем), но конкурентные настройки будут переназначены командой setxkbmap. Для начала давайте разберемся, куда поместить команду. Если вы пользователь ДЕ — лучше всего будет воспользоваться приложением автозапуска. Во всяком случае, это гарантированно избавит от проблемы переназначения раскладки, я описал ее выше. Если вы не хотите использовать приложение автозапуска по идеологическим соображениям, или если вы не используете ДЕ, — поместите команду в конфигурационный скрипт вашего ВМ (у меня это ~/.i3/config) или прямо в ~/.xinitrc. Если настройки все-таки сбиваются (иначе говоря, если ваша идеология странным образом позволяет использовать ДЕ и отказываться от приложений автозапуска) — можете прибегнуть к варианту со следующей записью в инициализационном скрипте:
exec sleep 45; setxkbmap -option grp:caps_toggle -option lv3:ralt_switch -option grp_led:caps -layout us+typo,ru:2+typo

Указание подождать 45 секунд позволит пропустить всё, что могло переназначить раскладку. Без него строка для включения в скрипт выглядит так:
exec setxkbmap -option grp:caps_toggle -option lv3:ralt_switch -option grp_led:caps -layout us+typo,ru:2+typo

А команда, которую вы можете выполнить в терминале немедленно и наблюдать эффект так:
$ setxkbmap -option grp:caps_toggle -option lv3:ralt_switch -option grp_led:caps -layout us+typo,ru:2+typo

Прошу прощения за излишне подробные примеры, но возможно кому-то они окажутся полезны именно в таком виде. Параметры которые задает эта команда мы уже рассмотрели говоря о файле /etc/X11/xorg.conf.d/10-keyboard.conf. После выполнения команды можете проверить раскладки, переключая их «Капсом», и типографскую раскладку, обращаясь к ее символам с зажатым правым Альтом (например, правый Альт + «-» позволит набрать тире). Полный список значений третьего ряда указывается в файле /usr/share/X11/xkb/symbols/typo. Вы можете изменять или добавлять свои символы для третьего ряда, воспользовавшись сайтом консорциума Юникод чтобы узнать обозначение интересующего вас знака. Например, добавим короткое тире на клавишу с английской буквой «N»:
...
xkb_symbols "base" {
...
key <­AB06­> { [NoSymbol, NoSymbol, endash, minus] };
};


NB! После «<» и перед «>» в примере выше я поставил гифены, чтобы запись не была пропарсена как тег. Прежде чем вставлять запись в свой файл необходимо удалить их.
Обратите внимание, кроме короткого тире (endash) мы назначили минус (minus) на ту же клавишу. Он набирается при зажатии правого Альта с «Шифтом». Хотя у меня минус стоит на клавише «m», но это дело вкуса.

Настройка параметров клавиатуры в ГУИ приложении

Думаю, они достаточно очевидны, чтобы не останавливаться на этом в статье. Тем более что я предупреждал, — речь будет идти в основном о конкретно моем варианте настроек.

Настройка изменений раскладки при переключениях окон и ее индикаторов на каждом из них

Все это сделает одно приложение, — xxkb. Установим его:
# pacman -S xxkb

После установки нужно настроить конфигурационный файл. Создадим его если он не создался сам (~/.xxkbrc) и укажем в нем следующие настройки:
XXkb.image.path:/usr/share/xxkb # Директория, в которой расположены картинки флагов — /usr/share/xxkb
XXkb.button.enable: yes # Включение функции отображения кнопочки — да
XXkb.button.border.width: # Толщина рамки вокруг кнопочки — оставили пустым, рамки не будет
XXkb.button.border.color: # Цвет рамки — оставили пустым
XXkb.button.label.enable: false # Текст на кнопочке — не будет
XXkb.button.label.font: # Шрифт текста на кнопочке — оставили пустым
XXkb.button.label.background: # Фон кнопочки — оставили пустым, у нас ведь будет флажок
XXkb.button.label.foreground: # Цвет шрифта — оставили пустым
XXkb.button.geometry: 14x14-2+1 # Высота, ширина, положение по оси абсцисс (x) относительно правого края, положение по оси ординат (y) относительно верха
XXkb.button.image.1: en15.xpm # Название файла с флажком для первой раскладки, она у нас английская, с ней будут открываться новые окна
XXkb.button.image.2: ru15.xpm # Название файла с флажком для второй раскладки, русской
XXkb.button.image.3: # Название файла с флажком для третьей раскладки — оставили пустым
XXkb.button.image.4: # Название файла с флажком для четвертой раскладки — оставили пустым
XXkb.controls.add_when_start: yes # Начинать контролировать раскладку с запуском приложения
XXkb.controls.add_when_create: yes # Начинать контролировать раскладку каждого окна с его созданием
XXkb.controls.add_when_change: no # Начинать контролировать раскладку окна только если оно в фокусе и в нем изменилась раскладка.


С такой конфигурацией каждое окно моего тайлового менеджера украшено аккуратным флажком, отображающим текущую раскладку, в заголовке. У некоторых пользователей при такой конфигурации приложение не работает должным образом и они советуют добавить вместо «XXkb.controls.add_when_change: no»
XXkb.controls.add_when_change: yes
XXkb.controls.focusout: yes


Более подробно и очень понятно о настройках приложения написано в мане. После сохранения конфигурационного файла запустите его следующей командой:
$ xxkb &

Не забудьте добавить команду в инициализационный скрипт, например ~/.xinitrc:
exec xxkb

Переназначение функций клавишам

Для этого нам понадобится два приложения: xev для того чтобы узнать коды и названия клавиш и xmodmap, чтобы переназначить им функции.
$ xev

Откроется окно. По нажатию любой клавиши (кроме физической «Fn») консоль выведет нечто подобное следующему:
KeyRelease event, serial 27, synthetic NO, window 0x2400001,
root 0xfe, subw 0x0, time 34357283, (314,209), root:(318,617),
state 0x0, keycode 118 (keysym 0xff63, Insert), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False


Здесь нас интересует то, какую клавишу мы нажали, keycode (118 в данном случае) и keysym (Insert). Чтобы переназначит клавишу с помощью xmodmap введем следующую команду:
$ xmodmap -e "keycode 105 = Delete"

Здесь «119» — это код клавиши которой мы хотим назначит ту или иную функцию, а «Delete» — название клавиши, которой эта функция принадлежит по умолчанию. Чтобы подобная команда выполнялась всякий раз при запуске, — поместите ее в ~/.xinitrc:
exec xmodmap -e "keycode 119 = Insert"

Кстати, этим же способ можно реализовать временное переключение раскладки при зажатии определенной клавиши:
exec xmodmap -e "keycode 94 = Mode_switch"

К сожалению, однако, он не позволяет назначить курсорам функции «Пэйджап», «Пэйдждаун», «Хом» и «Энд» при зажатом правом Альте. То есть позволять-то он позволяет, такая возможность есть и вы можете проверить ее командой, затем нажимая «Инсерт» в различных сочетаниях с «Капсом», «Шифтом» и Альтом:
$ xmodmap -e "keycode 105 = 1 2 3 4 5 6 7 8"

Но это сбивает возможность динамического выделения нажатием курсоров при зажатом «Шифте». Поняв, что так осуществить задуманное не получится, я стал смотреть в сторону упомянутой ранее /usr/share/X11/xkb/symbols/typo. Я думал добавить туда строку:
key <­Left­> { [NoSymbol, NoSymbol, Home] };

Но это тоже сбивало выделение и пришлось обратиться к новым приложениям, — xbindkeys и xdotool (их необходимо предварительно установить). Правда первое в моем случае успешно заменила функция bind моего оконного менеджера, но вы можете использовать его. Ниже представлена строка из моего конфигурационного файла ~/.i3/config, добавляющая функцию «Пэйджап» левому курсору с зажатым правым Альтом:
bind Mod5+111 exec sleep 0.15; xdotool key Prior

Обратите внимание на костыль в виде задержки в две третьих секунды. Она была подобранна эмпирическим путем. В силу системы очереди xlib и однопоточности xorg без этой задержки наша нотация должным образом работать не будет. Меньше ее делать не рекомендуется— будет срабатывать через раз. Больше — нет смысла. Вот весь участок моего конфига, задающий функции курсорам:
bind Mod5+111 exec sleep 0.15; xdotool key Prior
bind Mod5+116 exec sleep 0.15; xdotool key Next
bind Mod5+113 exec sleep 0.15; xdotool key Home
bind Mod5+114 exec sleep 0.15; xdotool key End


Использовать xbindkeys вместо оконного менеджера для этих целей наверное еще правильнее. Все что нам нужно, — это установить приложение:
# pacman -S xbindkeys

Затем вызвать окошко определения нажатой клавиши или сочетания комадой
$ xbindkeys -k

Нажать клавишу и получить вывод консоли вида:
"(Scheme function)"
m:0x80 + c:108
Mod5 + ISO_Level3_Shift


Прописать в конфигурационный файл ~/.xbindkeysrc:
"sleep 0.15; xdotool key Home"
m:0x80 + c:108

Сохранить и выполнить
$ xbindkeys

Также можно добавить команду в инициализационный скрипт. Кроме того, вместо xdotool можно использовать xbkbd. Это приложение — ничто иное как виртуальная клавиатура. Попробуйте установить его и выполнить следующую команду чтобы убедиться в этом:
$ xbkbd

Настройка функций по нажатию клавиш с помощью этой команды в основном аналогична настройке с помощью xdotool и выглядит так:
bind Mod5+111 exec sleep 0.15; xvkbd -text '\[Prior]'
Выберите то, что больше по душе ва́м. А мне осталось рассказать о двух способах клавиатурной эмуляции нажатия кнопки мыши.

Эмуляция мышиного клика по нажатию кнопки клавиатуры

Способ 1: с помощью xdotool:
bind 135 exec xdotool click 3
bind Mod5+135 exec xdotool click 2


Первая команда назначает функцию нажатия правой кнопки мыши на клавишу Меню. Вторая — функцию средней кнопки на клавишу Маню с зажатым правым Альтом.
Способ 2: с помощью команды xmodmap. Правда чтобы воспользоваться им придется дополнительно установить пакет xkbset. С его помощью мы разрешим эмуляцию нажатия кнопки мыши и снимем лимит времени на действие этого разрешения (изначально приложение разрабатывалось для людей с ограниченными возможностями по использованию мыши). А затем назначим кнопку на клавишу Меню:
exec xkbset m
exec xkbset exp =m
exec xmodmap -e "keycode 78 = Pointer_Button2"


Заключение

Это все что я хотел рассказать сегодня о настройках клавиатуры. В следующий раз попробуем разобраться с демоном actkbd; возможно с его помощью получится удовлетворить существующим требованиям более изящным образом. А этот текст подготовлен в редакторе Вим, спасибо за внимание ;-­)

Источники

  1. Типографская раскладка typo
  2. Временное переключение раскладки
  3. Ман по xxkb
  4. О настройке xbindkeys
  5. Об особенностях настройки xdotool с xbindkeys
  6. Арчвики и Ай-эр-си канал Арча, в особенности x3al
  7. Mapping middle-click to a keyboard key
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.