O que faz “Key to choose 5th level” em gnome-keyboard-properties?

17

Há uma opção para especificar uma tecla a ser usada para acessar o 5º nível no teclado em gnome-keyboard-properties("Teclado" em Hardware nas configurações do sistema):

Captura de tela da referida caixa de diálogo

Mas se eu definir o 5º nível AltGre o terceiro nível Right Ctrle se eu definir a chave 54 da seguinte maneira:

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

Recebo os seguintes resultados pressionando diferentes variações:

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. Então, o que o modificador do 5º nível faz?

  2. Como faço para configurá-lo para que eu possa obter 5 ou seis personagens diferentes a partir de uma única tecla (modificado por Shift, Alt Gre Right Ctrlpor exemplo)?

sup
fonte

Respostas:

14

1. Então, o que o modificador do 5º nível faz? ”

Escolhe o quinto nível. O modificador do 2º nível (apenas turno regular) escolhe o segundo nível e o 3º nível escolhe o terceiro nível.

O motivo pelo qual o modificador do quinto nível escolhe o quinto nível em vez do quarto (logo após o modificador do terceiro nível) é que esses três modificadores podem ser combinados de maneiras diferentes para escolher oito níveis diferentes (isso inclui o uso de qualquer um dos modificadores, pressionando uma tecla sem esses modificadores). Existem oito combinações desde 2 ↑ 3 = 8. Nos dois primeiros modificadores, existem quatro combinações:

  • Sem modificadores (nível 1)
  • Modificador de segundo nível, também conhecido como shift (nível 2)
  • Modificador de terceiro nível (nível 3)
  • 2º + 3º modificador (nível 4)

A adição do terceiro modificador (5º nível) adiciona mais quatro níveis.

"2. Como o configuro para que eu possa obter 5 ou 6 caracteres diferentes de uma única tecla (modificada por Shift Alt Gre , Right Ctrlpor exemplo)? ”

Antes de tudo, você precisa de um layout que use cinco ou mais caracteres por chave. Você pode escolher um layout existente, mas se você simplesmente deseja adicionar mais níveis ao layout que está usando no momento, isso pode não ser o ideal. Por exemplo, existe o layout do teclado Neo († 1), mas que é “otimizado para o idioma alemão”, não sendo tão bom para a maioria dos falantes de inglês.

Ainda assim, pode ser instrutivo dar uma olhada nas teclas que o Neo escolheu para o modificador de nível 5.

Layout Neo

Neo aparentemente chama o modificador de nível 5 para "Mod4". Então, como você pode ver, ele usa a tecla à direita da tecla shift esquerda ( LSGT) e a tecla alt direita / AltGrtecla. Isso ocorre em um teclado europeu (105 teclas) que, comparado ao teclado dos EUA (104 teclas), possui um deslocamento estreito para a esquerda e uma tecla de retorno alta e fina. Para um layout de teclado baseado no teclado americano, pode ser necessário - ou preferir - escolher outras teclas.

Escolhendo uma tecla modificadora de nível 5

Na resposta do sup, ele escolhe usar o Xmodmap. Atualmente, ferramentas como o Setxkbmap são recomendadas no Xmodmap. O Xkb vem com muitas opções predefinidas para escolher o modificador de nível 5. Se você consultar o man xkeyboard-config e procurar, lv5encontrará estas opções:

┌──────────────────────┬───────────────────────────────────────────────────┐
│ 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                                           │
└──────────────────────┴───────────────────────────────────────────────────┘

Portanto, as opções documentadas são a LSGTchave, a tecla alt direita, a tecla direita do Windows e a tecla esquerda do Windows. Como vimos, o Neo usa as duas primeiras opções.

Digamos que você queira usar a lv5:ralt_switch_lockopção com algum layout. Este comando configura o uslayout com esta chave modificadora de nível 5:

setxkbmap -option "lv5:ralt_switch_lock" us

Portanto, para qualquer uma das opções documentadas man xkeyboard-config, use isso como argumento ao -optionusar o Setxkbmap.

Caso essas opções não sejam suficientes e você deseje definir outra chave para ser o modificador de nível 5, é instrutivo examinar as declarações dessas opções. Eles parecem estar em /usr/share/X11/xkb/symbols/level5. A declaração para se lv5:ralt_switch_lockparece com isso:

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 ]
  };
};

O lado direito de symbols[Group1]declara qual chave ou caractere cada nível da chave deve produzir. Isso usa todos os oito níveis possíveis, já que é suposto bloquear o modificador de nível 5 quando pressionado junto com outra tecla shift do nível 5. Portanto, os níveis 5 a 8 são emitidos, ISO_Level5_Lockpois todos esses níveis são acessados ​​mantendo pressionada a tecla shift do nível 5 e alguma combinação das outras teclas shift (nenhuma para todas elas). Se você deseja apenas o comportamento de turno e não o comportamento de bloqueio se pressionado, você pode fazer uma declaração mais simples (do mesmo arquivo):

// 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)"
};

Adicionando níveis extras a um layout

Os layouts do Xkb são bastante modulares. Você pode incluir layouts existentes e alterá-los. Assim, podemos escolher um layout existente com menos de 5 níveis e adicionar alguns níveis a ele.

Você pode criar novos layouts copiando o arquivo com seus layouts para /usr/share/X11/xkb/symbols/, ou onde quer que suas ferramentas Xkb procurem layouts. Mas isso requer privilégio sudo, portanto, não é a melhor solução. Como alternativa, você pode copiar a estrutura de diretórios xkb/ e colocar seus layouts no diretório apropriado em xkb/, a saber symbols/. Então, diga que você criou um arquivo xkb-tree/symbols/my-layouts. Para usar os layouts definidos neste arquivo, você pode usar a -print opção de setxkbmape canalizar a saída para xkbcomp. Este script de wrapper aceita os layouts como entrada:

#!/bin/sh

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

No que diz respeito ao arquivo com o layout, digamos que queremos expandir o layout "internacional dos EUA", que usa quatro níveis. Antes de tudo, configuramos as teclas shift de nível 3 e 5 da mesma maneira que o 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)"
};

Agora queremos adicionar alguns caracteres extras. Vamos usar as quatro primeiras teclas dos layouts Qwerty como exemplo. Essas chaves são Qto R, que correspondem <AD01>a <AD04>. Primeiro, precisamos tornar as chaves capazes de usar até oito níveis:

key.type[Group1] = "EIGHT_LEVEL";

Nos quatro primeiros níveis, para não redefini-los, nós os mapeamos NoSymbol. Então nós adicionamos dois níveis. No nível 5, adicionamos as setas ←↓↑→(† 2). No nível 6, adicionamos as teclas de direção. Nosso layout acaba assim:

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
    ] };

};

Para usá-lo, podemos usar o script wrapper que criamos:

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

† 1: Neo está de(neo)em Xkb; setxkbmap "de(neo)".

† 2: para encontrar os nomes simbólicos que o Xkb usa, procure um arquivo chamado keysymdef.h. Deve estar em um diretório chamado X11/. Você também pode usar nomes Unicode, por exemplo, U2192para U + 2192.

Guildenstern
fonte
1
Obrigado por dedicar um tempo para compor esta resposta. Eu estava procurando uma maneira de usar minhas teclas JKLI como teclas de seta por um tempo agora, então isso foi incrivelmente útil. Por favor, aproveite esses 50 pontos extras! (Eu deveria ser capaz de atribuir a recompensa amanhã.)
Glutanimate
1
Bem, obrigado, este é um ótimo resposta, mesmo que seja um pouco tarde, mas é exatamente isso que eu estava procurando antes (mas agora o GNOME na verdade não suporta a configuração do modificador - mas desde que funcione usando arquivos de configuração, todos está bem).
sup
8

Bem, depois de um pouco de escavação:

(1) A chave para escolher o 5º nível faz algumas coisas estranhas (relacionadas a alguns layouts em francês) que não são relevantes para o que eu queria fazer. Basicamente, define qual chave atuará como ISO_Level5_Shift. ISO_Level5_Shift é usado em alguns layouts obscuros. Esta resposta é baseada no número de resultados que o Google fornece ao pesquisar "ISO_Level5_Shift" e nesses links .

(2) Não pode ser utilizado para obter 6 símbolos de uma tecla física. Uma maneira de conseguir isso é com o uso do arquivo .xmodmap colocado no diretório $ HOME.

Primeiro, comando

xmodmap -pm

fornece o que os símbolos-chave agem como vários modificadores. No meu sistema, era o seguinte:

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)

O mod3 precisa ser configurado para usar 6 símbolos com uma tecla. Isso precisa ser colocado no arquivo .xmodmap:

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

Então xmodmap -pm me deu:

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)

Onde keycode 94 é a chave que eu escolhi para atuar como mod3. Os códigos de teclas de várias teclas físicas podem ser encontrados com a ferramenta de linha de comando xev (basta executá-la e pressionar várias teclas, os códigos de tecla aparecerão).

Então, se eu colocar no arquivo .xmodmap

keycode 54 = 1 2 3 4 5 6

ou correr

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

Recebo seis símbolos diferentes de uma tecla com o uso de altgr, shift e keycode 94 (é uma tecla inútil ao lado do shift esquerdo no meu layout físico).

UPDATE: se você precisar de apenas cinco símbolos, é útil configurá-lo assim:

keycode 54 = 1 2 3 3 5 6

Ocasionalmente acontece comigo que eu recebo 4 em vez de 3 caso contrário.

sup
fonte