como atribuir outro modificador à tecla Alt do X11?

9

Alvo:

Gostaria de atribuir Alt à CapsLock-key e Meta à Alt-key. Mas, dessa maneira, a tecla Alt não seria mais reconhecida como Alt e a tecla CapsLock não seria mais reconhecida como CapsLock.

openSUSE 11.4

Anteriormente:

openSUSE 11.1 - como sou o único usuário do meu computador, "simplesmente" editei o arquivo / usr / share / X11 / xkb / keycodes / xfree86 e funcionou sem problemas. As chaves foram conectadas aos seus símbolos no nível mais baixo.

Problemas:

  1. xkb

    Eu criei uma variante do layout polonês (pl_ext) que (para teste) consiste nessas entradas:

    key <CAPS> { [ Alt_L ] };
    modifier_map Mod1 { Alt_L, Alt_R };
    

    No entanto, isso simplesmente não faz nada, a tecla CapsLock no xev é reconhecida (símbolo) como Alt_L, mas quando eu pressiono a tecla CapsLock, ele se comporta como o CapsLock (por exemplo, supondo que você tenha o arquivo no menu, Alt + F deve abrir esse menu. )

    Pergunta: Como definir um arquivo de layout para definir a tecla CapsLock como Alt e a tecla Alt como Meta?

    Edit: Metade do sucesso aqui! Agora eu tenho essas entradas:

    key <CAPS> { [ Alt_L ] };
    modifier_map Mod1 { <CAPS> }; // this is a difference
    

    e isso funciona como desejado. Isto não:

    key <LALT> { [ Meta_L ] } ;
    key <RALT> { [ Meta_R ] } ;
    modifier_map Mod5 { <LALT>,<RALT> };
    

    As teclas Alt são reconhecidas como Meta pelo xev, mas ainda posso abrir os menus com Alt + F, alternar entre janelas e não devo. E, por outro lado, não posso inserir nenhum caráter nacional, e devo.

  2. xfree86

    Mas agora isso não funciona, acho que outra tabela de arquivos é lida em vez do xfree86.

    Pergunta: Como descobrir qual arquivo de tabela de código de chave é usado pelo sistema (X / Gnome)?

    Edit: A melhor opção para mim - editar tabelas de códigos-chave - foi resolvida pela resposta de macias !

  3. xmodmap

    Metade do sucesso aqui. Esta parte funciona como desejado:

    remover Lock = Caps_Lock keysym Caps_Lock = Alt_L

    Agora, tenho verdadeiramente a tecla CapsLock, que é mapeada para Alt. Mas isso:

    keysym Alt_L = Meta_L

    ... faz coisa estranha. O xev mostra que a tecla Alt é mapeada para Meta, mas quando pressiono Alt + F (isso deve ser mapeado para Meta + F -> sem fazer nada), o menu Arquivo é aberto. Além do mais, quando pressiono Alt + Tab, recebo o alternador de janelas (não devo - Alt é Meta agora).

    Pergunta: Como "excluir" o antigo comportamento da tecla Alt?

    Edit: Esta parte é resolvida pela resposta de Gilles .

Resumo:

Responder a qualquer pergunta (espero) resolveria o meu problema, no entanto, prefiro usar o xkb inteiramente porque poderia empacotar todos os arquivos do xkb e alterar o layout em um único local. Obrigado desde já por qualquer ajuda!

greenoldman
fonte
Se você encontrou uma resposta, publique-a como tal e forneça informações suficientes para outras pessoas que possam estar interessadas. (É perfeitamente bom responder à sua própria pergunta se você encontrou a resposta em outro lugar ou sozinho; você pode até marcar sua resposta como aceita, se quiser.)
Gilles 'SO- pare de ser mau'
@ Gilles, ok, mas mantenho sua resposta como resposta, apenas para evitar possíveis acusações, eu fiz isso por pontos. Além disso, sua ajuda foi muito valiosa para mim.
greenoldman
Você não ganha pontos por aceitar sua própria resposta de qualquer maneira. (Você obtém pontos pelos votos em sua própria resposta, o que é justo desde que você fez o trabalho.) O mais importante é ter as informações claramente apresentadas. Agora existem duas respostas para essa pergunta, uma com xmodmap e outra com xkb, e a página pareceria mais clara se ambas fossem postadas como respostas.
Gilles 'SO- stop be evil'

Respostas:

7

(Esta resposta é apenas sobre o xmodmap. Tenho certeza de que é possível fazer isso com o XKB, apenas não sei como.)

Modificadores e academias de teclas são atribuídos de forma independente. Mas você obtém efeitos estranhos se não os definir consistentemente. Acho que tudo o que está faltando é o addcomando ao qual atribuir um modificador Meta_L, embora você também precise limpar e reatribuir as teclas modificadoras. Você pode substituir Mod1e Mod2por Mod3, Mod4e Mod5: eles são intercambiáveis, apenas certifique-se que você não use um para dois propósitos diferentes.

clear Mod1
clear Mod2
remove Lock = Caps_Lock
keysym Caps_Lock = Alt_L
keysym Alt_L = Meta_L
add Mod1 = Alt_L Alt_R
add Mod2 = Meta_L Meta_R
Gilles 'SO- parar de ser mau'
fonte
Muito obrigado. Então, de fato, usei o Mod5 em vez do Mod2 para o Meta, e agora posso escrever como esperado (eu uso a tecla meta + para muitos caracteres nacionais). Mas, estranhamente, agora tenho problemas com a tecla CapsLock novamente - ela está ligada a ... Meta. Acho que sim, porque uma vez que existe uma ligação para Alt, mas Alt é redefinido. Então, como fazer a diferença e uma vez insistir no código e pela segunda vez no símbolo? Gostaria de não usar códigos de tecla brutos, pois eles podem mudar de teclado para teclado. Não posso trocar a ordem das academias de teclas, porque na última linha eu receberia erro.
greenoldman
O problema keysym Caps_Lock = Alt_Lé que, se você executá-lo duas vezes, ele coloca o sistema novamente em um estado indesejado. É por isso que eu uso códigos de chave ; eles variam entre sistemas operacionais e arquiteturas (não entre teclados), mas não com tanta frequência.
Gilles 'SO- stop be evil'
Obrigado pela explicação, adivinhei então :-). Se você não se importa, vou mantê-lo um pouco mais como uma pergunta sem resposta, talvez alguém possa resolver meu problema no nível xkb, o que seria mais flexível (alternar layouts mata xmodmaps).
greenoldman
Muito obrigado, continuei lutando com os símbolos / pc sem sucesso.
Cody Craven
9

Abordagem de edição de códigos de chave

Encontrei a resposta no fórum polonês do Ubuntu. Agora, não se edita o arquivo "xfree86", mas o arquivo "evdev". Dessa forma, você pode fazer alterações permanentes que funcionem em todos os layouts.

Exemplo (a pedido do Gilles) - faça o login como root, vá para

/usr/share/X11/xkb/keycodes

faça um backup do arquivo "evdev" e edite-o. Mude os códigos ao seu gosto, por exemplo, no meu caso:

<LALT> = 66; // when I press CapsLock (66 code) system will report pressing LeftAlt
<LMTA> = 64; // I will get LeftMeta when pressing LeftAlt (64 code)

Você pode encontrar quais são os códigos executando o comando "xev", mas pode simplesmente ver o arquivo "evdev" original.

Saia, entre, aproveite o seu novo teclado :-).

greenoldman
fonte
este é provavelmente o caminho certo a seguir com o XKB. Estou executando o Linux Mint e encontrando problemas nas quais as Keyboard Preferencesopções para Capslocksubstituir a XKBconfiguração personalizada que eu escrevo. Como é uma seleção de botão de opção, não há como eu impedir que uma das regras da GUI seja aplicada.
dcunited001
Você pode preservar o comportamento do LALT? Ou seja, não alterá-lo para LMTA? Eu tentei, mas, aparentemente, não se pode ter duas atribuições da forma <LALT> = ...
Daniel
com isso, foi tão fácil alternar entre LALT e RALT no ubuntu ... muito obrigado. para todos os googlers: mapeie alt para outra chave ubuntu alt para altgr ubuntu remapear alt para ctrl
Noel Schenk
4

tente isto:

    key <CAPS>  { [ Alt_L, Alt_L ] };
    key <LALT> { [ Meta_L, Meta_L ] };
    modifier_map Mod1 { Alt_L, Alt_R };
    modifier_map Mod5 { Meta_L, Meta_R };

observe as duas definições de nível. Isso ocorre porque o padrão para LALT é [Alt_L, Meta_L]; se você não redefinir o segundo, ele permanecerá Meta_L.

Veja esta resposta no xkb para redefinir algumas chaves sem precisar editar os arquivos padrão principais (portanto, não precisa ser root). Nesse caso, você precisará no arquivo de símbolos locais uma pequena seção como:

partial modifier_keys
xkb_symbols "capsasalt_altasmeta" {
        replace key <CAPS>  { [ Alt_L, Alt_L ] };
        replace key <LALT> { [ Meta_L, Meta_L ] };
        modifier_map Mod1 { Alt_L, Alt_R };
        modifier_map Mod5 { Meta_L, Meta_R };
};
Pablo Saratxaga
fonte