Eu queria adicionar mais níveis aos meus layouts de teclado, então decidi habilitar a chave level5. Já tive level3 em Menu
e gostaria de mapear RAlt para ISO_Level5_Shift.
No entanto, setxkbmap
não tem opção para isso. /usr/share/X11/xkb/rules/evdev.lst
contém apenas as seguintes opções em relação ao switch lv5:
lv5:lsgt_switch_lock
lv5:ralt_switch_lock
lv5:lwin_switch_lock
lv5:rwin_switch_lock
Como se o mapeamento de uma chave simples não fosse possível. Isso já sugeriu problemas.
Sabendo que setxkbmap
faz internamente, é fácil criar uma opção para ativar o comutador lv5 e configurá-lo para a direita Alt
:
-option "lv5:ralt_switch"
E, apesar de setxkbmap
ter essa opção e retornar com sucesso, não há mapeamento.
Depois de encontrar uma resposta para uma pergunta semelhante aqui , construí um arquivo xkbcomp
personalizado.
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 ]
};
};
};
Isso deve atribuir a tecla Menu para ser ISO_Level3_Shift e RAlt para ser ISO_Level5_Shift. E as chaves são atribuídas, mas há um erro:
$ xkbcomp ~/new.xkbcomp.xkb :0
Error: Key <MDSW> added to map for multiple modifiers
Using Mod3, ignoring Mod5.
xkbcomp
retorna com o código 0, apesar de ter ocorrido um erro.
O mapeamento na chave N
deveria ter feito os níveis 5 a 8 "u", "i", "o" e "p", mas a RAlt envia os habituais n e N nos oito níveis (se os níveis & gt ; 4 realmente funcionam).
Na tentativa de determinar como resolvo este erro, descobri que <MDSW>
está definido em ... o próprio arquivo de regras para "pc".
/usr/share/X11/xkb/symbols/pc
:
xkb_symbols "pc105" {
…
// Fake keys for virtual<->real modifiers mapping:
key <LVL3> { [ ISO_Level3_Shift ] };
key <MDSW> { [ Mode_switch ] };
modifier_map Mod5 { <LVL3>, <MDSW> };
…
};
E aqui está outra coisa estranha: eu incluo o modelo de teclado pc104, mas esse código se refere ao pc105 e não deve ser originado de forma alguma. No entanto… xkb_symbols "pc104"
está longe de ser encontrado. E esse arquivo "symbols / pc" é o único outro arquivo em /usr/share/X11/xkb/
que define ou modifica a atribuição <MDSW>
para as chaves Mod *. O outro arquivo é "symbols / level5", que faz isso em xkb_symbols "modifier_mapping"
.
// Ensure a mapping to a real modifier for LevelFive.
partial modifier_keys
xkb_symbols "modifier_mapping" {
replace key <MDSW> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ ISO_Level5_Shift ]
};
modifier_map Mod3 { <MDSW> };
};
Acho que esse conflito pode impedir que o switch lv3 e o lv5 funcionem ao mesmo tempo, mas não tenho certeza. É preocupante que em outra resposta , a chave Mode_switch
esteja presente entre as teclas Mod *, e depois de carregar o meu new.xkbcomp.xkb
don veja em qualquer lugar:
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
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)
Tags xkb