Вопрос или проблема
Я хотел добавить больше уровней к своим раскладкам клавиатуры, поэтому решил включить клавишу уровня 5. У меня уже был уровень 3 на Menu
, и я хотел бы сопоставить RAlt с ISO_Level5_Shift.
Однако в setxkbmap
нет такой опции. /usr/share/X11/xkb/rules/evdev.lst
содержит только следующие опции касательно переключателя lv5:
lv5:lsgt_switch_lock
lv5:ralt_switch_lock
lv5:lwin_switch_lock
lv5:rwin_switch_lock
Как будто сопоставить простую клавишу невозможно. Это уже намекало на проблемы. Зная, что делает setxkbmap
внутренне, легко составить опцию для включения переключателя lv5 и установки на правый Alt
:
-option "lv5:ralt_switch"
И, несмотря на то, что setxkbmap
принимает эту опцию и возвращает с успехом, сопоставления нет.
После того как я нашел ответ на похожий вопрос здесь, я составил собственный файл xkbcomp
.
xkb_keymap {
xkb_geometry {
include "pc(pc104)"
};
xkb_keycodes {
include "evdev"
include "aliases(qwerty)"
};
xkb_types {
include "complete"
};
xkb_compatibility {
include "complete"
include "ledscroll(group_lock)"
};
xkb_symbols {
include "pc+us+ru:2+inet(evdev)"
include "group(rctrl_rshift_toggle)"
include "ctrl(swapcaps)"
include "keypad(oss)"
include "kpdl(dot)"
include "terminate(ctrl_alt_bksp)"
include "level3(modifier_mapping)"
include "level3(menu_switch)"
include "level5(modifier_mapping)"
include "level5(ralt_switch)"
key <AB06> {
type= "EIGHT_LEVEL",
symbols[Group1]= [ n, N, n, n, u, i, o, p ],
symbols[Group2]= [ Cyrillic_te, Cyrillic_TE, n, n, u, i, o, p ]
};
};
};
Это должно присвоить клавише Menu ISO_Level3_Shift, а RAlt – ISO_Level5_Shift. Клавиши присвоены, но возникает ошибка:
$ xkbcomp ~/new.xkbcomp.xkb :0
Error: Key <MDSW> added to map for multiple modifiers
Using Mod3, ignoring Mod5.
xkbcomp
возвращает код 0, несмотря на наличие ошибки.
Сопоставление на клавише N
должно было сделать уровни с 5 по 8 “u”, “i”, “o” и “p”, но вместо этого RAlt отправляет обычные n и N на всех восьми уровнях (если уровни >4 действительно работают).
В попытке выяснить, как решить эту ошибку, я обнаружил, что <MDSW>
установлен в… самом файле правил для “pc”.
/usr/share/X11/xkb/symbols/pc
:
xkb_symbols "pc105" {
…
// Фальшивые клавиши для отображения виртуальных<->реальных модификаторов:
key <LVL3> { [ ISO_Level3_Shift ] };
key <MDSW> { [ Mode_switch ] };
modifier_map Mod5 { <LVL3>, <MDSW> };
…
};
И вот еще одна странная вещь: я включаю модель клавиатуры pc104, но этот код относится к pc105 и вообще не должен использоваться. Однако… xkb_symbols "pc104"
нигде не найти. И этот файл “symbols/pc” является единственным другим файлом в /usr/share/X11/xkb/
, который устанавливает или модифицирует назначение <MDSW>
для клавиш Mod*. Другим файлом является файл “symbols/level5”, который делает это в xkb_symbols "modifier_mapping"
.
// Обеспечить сопоставление с реальным модификатором для LevelFive.
partial modifier_keys
xkb_symbols "modifier_mapping" {
replace key <MDSW> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ ISO_Level5_Shift ]
};
modifier_map Mod3 { <MDSW> };
};
Я думаю, что этот конфликт может предотвратить работу как переключателя lv3, так и переключателя lv5 одновременно, но я не уверен. Это вызывает беспокойство, что в другом ответе клавиша Mode_switch
присутствует среди клавиш Mod*, и после загрузки моего new.xkbcomp.xkb
я не вижу ее нигде:
$ xmodmap -pm
xmodmap: до 4 клавиш на модификатор, (код клавиш в скобках):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x25)
control Control_L (0x42), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3 ISO_Level5_Shift (0xcb)
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c)
Вот мое рабочее решение для назначения ISO_Level5_Shift на Control_R. Вам нужно будет применить ту же логику.
- Запустите
xev
, чтобы найти код клавиши, которую вы хотите ассоциировать с ISO_Level5_Shift. Переместите курсор мыши над маленьким квадратом в окне, нажмите клавишу, чтобы увидеть ее код в выводе. В моем случае код был 105. - Во-вторых, я запустил
xmodmap
. Я увидел, что Control_R был связан с mod4. - Затем я выполнил
xmodmap -e "clear mod4"
, чтобы освободить клавишу. Обратите внимание, что это освобождает все клавиши, поэтому, если вам нужны другие клавиши, вы можете связать их обратно. - Затем
xmodmap -e "keycode 105 = ISO_Level5_Shift"
, чтобы ассоциировать Control_R с модификатором. - И наконец,
xmodmap -e "add mod3 = ISO_Level5_Shift"
, чтобы включить уровень 5.
Ответ или решение
Как сделать ISO_Level5_Shift работающим на вашей клавиатуре
Для успешной настройки ISO_Level5_Shift на вашей клавиатуре необходимо выполнить несколько шагов, учитывающих специфику вашей операционной системы и архитектуры ввода. В данном руководстве мы обсудим, как правильно настроить дополнительный уровень клавиатуры на примере правого Alt (RAlt), который мы хотим назначить на ISO_Level5_Shift.
Шаг 1: Определите код клавиши
Первый шаг в настройке — выяснить код клавиши, которую вы собираетесь использовать. Для этого воспользуйтесь утилитой xev
. Она отображает все события, связанные с клавиатурой и мышью в X-сервере. Выполните следующую команду в терминале:
xev
Убедитесь, что курсор мыши находится в окне, которое открылось, и нажмите клавишу. Вы увидите вывод, в котором будет указано значение keycode
. Запишите этот номер, он будет необходим для последующих шагов.
Шаг 2: Очистите текущее назначение клавиши
Теперь, зная код клавиши, перейдите к xmodmap
. сначала проверьте текущее назначение клавиш. Запустите команду:
xmodmap -pm
Это покажет, какие клавиши соответствуют модификаторам. Если RAlt уже установлен на другой модификатор (например, на mod4), вам нужно будет его освободить с помощью команды:
xmodmap -e "clear mod4"
Шаг 3: Назначьте RAlt на ISO_Level5_Shift
После освобождения клавиши вы можете связать код клавиши с ISO_Level5_Shift. Используйте следующую команду:
xmodmap -e "keycode <ваш код> = ISO_Level5_Shift"
Замените <ваш код>
на код, полученный с помощью xev
.
Шаг 4: Активируйте уровень 5
После того как вы назначили клавишу, добавьте ISO_Level5_Shift к модификатору mod3, выполнив команду:
xmodmap -e "add mod3 = ISO_Level5_Shift"
Шаг 5: Тестирование и отладка
После выполнения вышеперечисленных шагов протестируйте новое назначение клавиши, чтобы убедиться, что все работает корректно. Вам может понадобиться перезагрузить ваш сеанс X, чтобы применить изменения, или выполнить команду:
xkbcomp $DISPLAY
Если после выполнения этих шагов ISO_Level5_Shift все еще не работает, возможно, стоит проверить конфигурационные файлы X11 для конфликтов с другими назначениями клавиш. Например, убедитесь, что в файле /usr/share/X11/xkb/symbols/pc
и других связанных файлах нет конфликтов с модификаторами, как это было упомянуто в вашем исходном сообщении.
Заключение
Правильная конфигурация клавиатуры требует иногда значительных усилий и тщательной отладки. Следуя приведенным шагам, вы сможете успешно настроить ISO_Level5_Shift на любой желаемой клавише, используя свою настольную среду. Если у вас возникнут дополнительные вопросы или проблемы, полезно обратиться к документации по XKB или сообществам поддержки, чтобы получить помощь от специалистов.