Что действительно “Вводит для выбора, 5-й уровень” в свойствах клавиатуры гнома делают?

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

Screenshot of said dialog

Но если я установил 5-й уровень на AltGr и третий уровень для Исправления 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 или шесть различных символов из единственного ключа (измененный Сдвигом, Высокий звук Gr и Правильный Ctrl, например)?

17
задан 31 March 2018 в 09:26

2 ответа

Ну, после небольшого копания:

(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)

mod3 необходимо настроить, чтобы использовать 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)

Где keycode 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 в противном случае.

0
ответ дан 31 March 2018 в 09:26

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

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

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

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

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

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

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

Neo layout

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

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

В ответе супера он решил использовать 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"

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

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: Neo - это de(neo) в Xkb; [+1136]. [+1173]

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

0
ответ дан 31 March 2018 в 09:26

Другие вопросы по тегам:

Похожие вопросы: