«А всё-таки она Матрица!» — сказал Лео».
Мне захотелось, чтобы раскладки клавиатуры переключались немодально. Caps — ну, вы помните, да?.. — у меня на машине отсутствует как класс. Посему я подумал некоторое время и выбрал в качестве будущей юдоли сочетания right shift + right control и left shift + left control, первое для стабильного переключения на латиницу (“qwerty”), второе на русский (“йцукен”).
Как это делается. Я решил использовать существующий переключатель, модернизировав его на свой лад. В Xorg, как мы помним, переключатель по ctrl-shift так и называется: “ctrl_shift_toggle”. Проставляем его в /etc/X11/xorg.conf в секции InputDevice с драйвером kdb:
Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbVariant" "basic,winkeys"
Option "XkbOptions" "grp:ctrl_shift_toggle,ctrl:nocaps,grp_led:caps"
EndSection
Открываем /usr/share/X11/xkb/symbols/group, ищем там соответствующую секцию.
// using the group(ctrl_shift_toggle) map, pressing:
// Control_L+Shift_L locks the prev group
// Control_R+Shift_R locks the next group
// If you have two groups and group wrap is enabled, the effect is
// indistinguishable.
partial modifier_keys
xkb_symbols "ctrl_shift_toggle" {
key <LFSH> {
type[Group1]="PC_CONTROL_LEVEL2",
symbols[Group1]= [ Shift_L, ISO_Prev_Group ]
};
key <RTSH> {
type[Group1]="PC_CONTROL_LEVEL2",
symbols[Group1]= [ Shift_R, ISO_Next_Group ]
};
key <LCTL> { [ Control_L, ISO_Prev_Group ] };
key <RCTL> { [ Control_R, ISO_Next_Group ] };
};
Как видим, текущая настройка позволяет переключаться в двух направлениях по имеющимся раскладкам (на предыдущую и следующую раскладки соответственно), что на двух раскладках просто заменяет одну на “ту, другую”. Соответственно, нам надо помнить, какая из них у нас работает сейчас, то есть часть мозга решает задачу, которую решать не хочется — да, по большому счёту, и не нужно. Перенастраиваем переключение на последнюю и первую раскладки (в моём, довольно распространённом, случае, когда раскладки прописаны в порядке us, ru, left ctrl + left shift дадут русскую, а right ctrl + right shift, соответственно, латиницу).
// using the group(ctrl_shift_toggle) map, pressing:
// Control_L+Shift_L locks the last group
// Control_R+Shift_R locks the first group
// If you have two groups and group wrap is enabled, the effect is
// indistinguishable.
partial modifier_keys
xkb_symbols "ctrl_shift_toggle" {
key <LFSH> {
type[Group1]="PC_CONTROL_LEVEL2",
symbols[Group1]= [ Shift_L, ISO_Last_Group ]
};
key <RTSH> {
type[Group1]="PC_CONTROL_LEVEL2",
symbols[Group1]= [ Shift_R, ISO_First_Group ]
};
key <LCTL> { [ Control_L, ISO_Last_Group ] };
key <RCTL> { [ Control_R, ISO_First_Group ] };
};
Рестартовав Иксы, с удивлением обнаруживаем, что основную роль в нелёгком деле включения нужной раскладки играет одна из этих двух клавиш, нажатая последней. То есть, можно нажать произвольный Shift или произвольный Ctrl, а затем правую или левую завершающую клавишу комбинации: только она сыграет роль; таким образом, для переключения раскладок очень легко использовать клавиатурный аккорд на две руки, к чему крайне быстро привыкаешь.
Поэкспериментировав с разными способами включения удобоприятной раскладки, пришёл к такому:
xkb_symbols "shifts_toggle" {
key <LFSH> { [ Shift_L, ISO_Last_Group ] };
key <RTSH> { [ Shift_R, ISO_First_Group ] };
};
Всё.
Очень познавательно, так сказать хозяйке на заметку.
Афтару респект, сам использую Caps