Как заставить ISO_Level5_Shift работать?

Вопрос или проблема

Я хотел добавить больше уровней к своим раскладкам клавиатуры, поэтому решил включить клавишу уровня 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 или сообществам поддержки, чтобы получить помощь от специалистов.

Оцените материал
Добавить комментарий

Капча загружается...