Что делает «Ключ для выбора 5-го уровня» в свойствах gnome-keyboard?

18

Существует возможность указать ключ, который будет использоваться для доступа к 5-му уровню на клавиатуре gnome-keyboard-properties(«Клавиатура» в разделе «Оборудование» в настройках системы):

Скриншот указанного диалога

Но если я установлю 5-й уровень на AltGrи третий уровень на Right Ctrlи если я установлю ключ 54 следующим образом:

xmodmap -e "keycode 54 = 1 2 3 4 5 6 7 8"

Я получаю следующие результаты от нажатия различных вариантов:

keycode 54 = 1
keycode 54 + right ctrl = 5
keycode 54 + right ctrl + shift = 6
keycode 54 + shift = 2
keycode 54 + AltGr = 1
keycode 54 + AltGr + shift = 2
  1. Так что же делает модификатор 5-го уровня?

  2. Как мне настроить его так, чтобы я мог получить 5 или 6 разных символов из одного ключа (измененного Shift, например , Alt Grи Right Ctrl)?

вир
источник

Ответы:

15

«1. Так что же делает модификатор 5-го уровня? »

Выбирает пятый уровень. Модификатор 2-го уровня (просто обычная смена) выбирает второй уровень, а 3-й уровень выбирает третий уровень.

Причина, по которой модификатор 5-го уровня выбирает пятый уровень вместо четвертого уровня (сразу после модификатора 3-го уровня), заключается в том, что эти три модификатора можно комбинировать различными способами для выбора восьми различных уровней (это включает в себя не использование каких-либо модификаторов, который просто нажимает клавишу без таких модификаторов). Существует восемь комбинаций, так как 2 combinations 3 = 8. Для первых двух модификаторов существует четыре комбинации:

  • Без модификаторов (уровень 1)
  • Модификатор 2-го уровня, он же сдвиг (уровень 2)
  • Модификатор 3-го уровня (уровень 3)
  • 2-й + 3-й модификатор (уровень 4)

Добавление третьего модификатора (5-й уровень) добавляет еще четыре уровня.

«2. Как мне настроить его так, чтобы я мог получить 5 или 6 разных символов из одной клавиши (например, измененной Shift, Alt Grи т.д. Right Ctrl)? »

Прежде всего вам нужен макет, который использует пять или более символов на клавишу. Вы можете выбрать существующий макет, но если вы просто хотите добавить больше уровней к макету, который вы используете в данный момент, это может оказаться неоптимальным. Например, есть раскладка клавиатуры Neo († 1), но она «оптимизирована для немецкого языка», поэтому не подходит для большинства носителей английского языка.

Тем не менее, было бы поучительно посмотреть, какие ключи выбрал Нео для модификатора 5-го уровня.

Нео макет

Нео, по-видимому, называет модификатор 5 уровня для «Mod4». Так что, как вы можете видеть, он использует клавишу справа от левой клавиши Shift ( LSGT) и правую клавишу Alt / AltGrклавишу. Это на европейской клавиатуре (105 клавиш), которая по сравнению с американской клавиатурой (104 клавиши) имеет узкое левое смещение и высокую и тонкую клавишу возврата. Для раскладки клавиатуры, основанной на клавиатуре США, может потребоваться - или предпочтительнее - выбрать другие клавиши.

Выбор 5 уровня клавиши-модификатора

В ответе sup он решает использовать Xmodmap. В настоящее время такие инструменты, как Setxkbmap, рекомендуются поверх Xmodmap. Xkb поставляется с множеством предопределенных опций для таких вещей, как выбор модификатора уровня 5. Если вы обратитесь к man xkeyboard-config и выполните поиск, lv5вы найдете следующие опции:

┌──────────────────────┬───────────────────────────────────────────────────┐
│ Option               │ Description                                       │
├──────────────────────┼───────────────────────────────────────────────────┤
│ lv5:lsgt_switch_lock │ <Less/Greater> chooses 5th level; acts as onetime │
│                      │ lock when pressed together with another 5th level │
│                      │ chooser                                           │
├──────────────────────┼───────────────────────────────────────────────────┤
│ lv5:ralt_switch_lock │ Right Alt chooses 5th level; acts as onetime lock │
│                      │ when pressed together with another 5th level      │
│                      │ chooser                                           │
├──────────────────────┼───────────────────────────────────────────────────┤
│ lv5:lwin_switch_lock │ Left Win chooses 5th level; acts as onetime lock  │
│                      │ when pressed together with another 5th level      │
│                      │ chooser                                           │
├──────────────────────┼───────────────────────────────────────────────────┤
│ lv5:rwin_switch_lock │ Right Win chooses 5th level; acts as onetime lock │
│                      │ when pressed together with another 5th level      │
│                      │ chooser                                           │
└──────────────────────┴───────────────────────────────────────────────────┘

Таким образом, задокументированные параметры - это LSGTключ, правая клавиша Alt, правая клавиша Windows и левая клавиша Windows. Как мы уже видели, Neo использует первые два варианта.

Скажем, вы хотите использовать lv5:ralt_switch_lockопцию с некоторым макетом. Эта команда устанавливает usмакет с помощью этой клавиши-модификатора уровня 5:

setxkbmap -option "lv5:ralt_switch_lock" us

Так что для любого из параметров, которые описаны в документе man xkeyboard-config, используйте это в качестве аргумента -optionпри использовании Setxkbmap.

Если этих опций недостаточно, и вы хотите определить другой ключ в качестве модификатора уровня 5, полезно взглянуть на объявления этих опций. Кажется, они в /usr/share/X11/xkb/symbols/level5. Объявление для lv5:ralt_switch_lockвыглядит так:

partial modifier_keys
xkb_symbols "ralt_switch_lock" {
  include "level5(lock)"
  key <RALT> {
    type[Group1] = "EIGHT_LEVEL",
    symbols[Group1] = [ ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift,
                        ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock, ISO_Level5_Lock ]
  };
};

В правой части symbols[Group1]указывается, какой ключ или символ должен генерировать каждый уровень ключа. При этом используются все восемь возможных уровней, поскольку предполагается блокировать модификатор уровня 5 при нажатии вместе с другой клавишей Shift уровня 5. Таким образом, уровни 5–8 испускаются, ISO_Level5_Lockпоскольку доступ ко всем этим уровням осуществляется путем удержания сдвига уровня 5 и некоторой комбинации других клавиш Shift (ни одной из них). Если вам нужно только поведение сдвига, а не поведение блокировки, если нажата две, вы можете сделать более простое объявление (из того же файла):

// The right Alt key (while pressed) chooses the fifth shift level.
partial modifier_keys
xkb_symbols "ralt_switch" {
  key <RALT> {
    type[Group1]="ONE_LEVEL",
    symbols[Group1] = [ ISO_Level5_Shift ]
  };
  include "level5(modifier_mapping)"
};

Добавление дополнительных уровней в макет

Макеты Xkb довольно модульные. Вы можете включить существующие макеты и изменить их. Таким образом, мы можем выбрать существующий макет с менее чем 5 уровнями и добавить к нему несколько уровней.

Вы можете создавать новые макеты, копируя файл с вашими макетами /usr/share/X11/xkb/symbols/, или где бы ваши инструменты Xkb не искали макеты. Но это требует привилегий sudo, поэтому это не лучшее решение. В качестве альтернативы вы можете скопировать структуру каталогов xkb/ и поместить ваши макеты в соответствующий каталог xkb/, а именно symbols/. Скажем, вы сделали файл xkb-tree/symbols/my-layouts. Чтобы использовать макеты, определенные в этом файле, вы можете использовать -print опцию setxkbmapи затем направить вывод xkbcomp. Этот скрипт-обертка принимает макеты в качестве входных данных:

#!/bin/sh

# `-option ""` resets all options.
setxkbmap -option "" -layout "$1" \
    -print |
    xkbcomp -I"<path-to-project>/xkb-tree" - "$DISPLAY"

Что касается файла с макетом, скажем, мы хотим расширить макет «США международный», который использует четыре уровня. Прежде всего, мы настраиваем клавиши Shift уровня 3 и уровня 5 так же, как Neo:

partial alphanumeric_keys
xkb_symbols "mine" {
    // US international
    include "us(intl)"
    // Set up level 3 modifiers.
    include "level3(modifier_mapping)"
    include "level3(bksl_switch)"
    include "level3(caps_switch)"
    // Set up level 5 modifiers.
    include "level5(modifier_mapping)"
    include "level5(lsgt_switch)"
    include "level5(ralt_switch)"
};

Теперь мы хотим добавить несколько дополнительных символов. Давайте просто использовать первые четыре ключа раскладок Qwerty в качестве примера. Эти ключи Qк R, которые соответствуют <AD01>в <AD04>. Для начала нам нужно сделать ключи способными использовать до восьми уровней:

key.type[Group1] = "EIGHT_LEVEL";

Для первых четырех уровней, чтобы не переопределять их, мы сопоставляем их с NoSymbol. Затем мы добавляем два уровня. На уровне 5 мы добавляем стрелки ←↓↑→(† 2). На уровне 6 мы добавляем клавиши со стрелками. Наш макет выглядит примерно так:

partial alphanumeric_keys
xkb_symbols "mine" {
    // US international
    include "us(intl)"
    // Set up level 3 modifiers.
    include "level3(modifier_mapping)"
    include "level3(bksl_switch)"
    include "level3(caps_switch)"
    // Set up level 5 modifiers.
    include "level5(modifier_mapping)"
    include "level5(lsgt_switch)"
    include "level5(ralt_switch)"

    // Make the following keys capable of using eight levels.
    key.type[Group1] = "EIGHT_LEVEL";

    key <AD01> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        leftarrow, Left
    ] };
    key <AD02> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        downarrow, Down
    ] };
    key <AD03> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        uparrow, Up
    ] };
    key <AD04> { [
        NoSymbol, NoSymbol, NoSymbol, NoSymbol,
        rightarrow, Right
    ] };

};

Чтобы использовать его, мы можем использовать скрипт-обертку, который мы сделали:

./setxkbmap-wrapper "my-layouts(mine)"

† 1: Нео находится de(neo)в Xkb; setxkbmap "de(neo)",

† 2: Чтобы найти символические имена, которые использует Xkb, найдите файл с именем keysymdef.h. Он должен быть в каталоге с именем X11/. Вы также можете использовать имена Unicode, например, U2192для U + 2192.

Гильденстерн
источник
1
Спасибо, что нашли время, чтобы написать этот ответ. Я некоторое время искал способ использовать мои клавиши JKLI в качестве клавиш со стрелками, так что это оказалось невероятно удобным. Пожалуйста, наслаждайтесь этими дополнительными 50 баллами! (Я должен быть в состоянии назначить награду завтра.)
Glutanimate
1
Что ж, спасибо, это отличный ответ, даже если он немного запаздывает, но это именно то, что я искал назад, чем (но теперь GNOME фактически не поддерживает установку модификатора - но пока он работает с использованием файлов конфигурации, все хорошо).
вир
8

Ну а после копания немного

(1) Ключ для выбора 5-го уровня делает некоторые странные вещи (относительно некоторых французских раскладок), которые не имеют отношения к тому, что я хотел сделать. В основном это устанавливает, какой ключ будет действовать как ISO_Level5_Shift. ISO_Level5_Shift используется в некоторых непонятных макетах. Этот ответ основан на количестве результатов, которые Google выдает при поиске «ISO_Level5_Shift», и на этих ссылках .

(2) Его нельзя использовать для получения 6 символов из одного физического ключа. Одним из способов достижения этого является использование файла .xmodmap, размещенного в каталоге $ HOME.

Во-первых, команда

xmodmap -pm

дает какие ключевые символы действуют как различные модификаторы. В моей системе это было так:

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x9)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c)

Мод 3 необходимо настроить, чтобы использовать 6 символов с одной клавишей. Это должно быть помещено в файл .xmodmap:

clear mod3
clear mod5
keycode 94 = Mode_switch
add mod3 = Mode_switch
add mod5 = ISO_Level3_Shift

Затем xmodmap -pm дал мне:

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x9)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Mode_switch (0x5e),  Mode_switch (0xcb)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  ISO_Level3_Shift (0x6c)

Где код 94 - это ключ, который я выбрал, чтобы действовать как mod3. Коды клавиш различных физических клавиш можно найти с помощью инструмента командной строки xev (просто запустите его и нажмите различные клавиши, коды клавиш появятся).

Затем, если я помещаю в файл .xmodmap

keycode 54 = 1 2 3 4 5 6

или беги

xmodmap -e "keycode 54 = 1 2 3 4 5 6"

Я получаю шесть разных символов из одной клавиши, используя altgr, shift и keycode 94 (это бесполезная клавиша рядом с левой клавишей на моей физической раскладке).

ОБНОВЛЕНИЕ: если вам нужно всего пять символов, удобно настроить его следующим образом:

keycode 54 = 1 2 3 3 5 6

Со мной иногда случается, что я получаю 4 вместо 3 в противном случае.

вир
источник