Como remapear permanentemente caps lock para esc no X11?

9

Quero remapear o caps lock para escapar no X11 (ou seja, pressionar o botão físico do caps lock será interpretado como esc pelos aplicativos e o comportamento do esc não será alterado). A solução deve sobreviver a um restart X . xmodmap e setxkbmap são soluções aceitáveis (assim como programas similares). Não quero lidar com uma GUI, pois quero que a solução seja portátil e faça parte dos meus arquivos de ponto. Se estiver faltando uma solução melhor / mais fácil / mais óbvia, informe-me, embora observe que não estou usando um DE (testando o i3wm).

Até agora, tentei usar xmodmap e setxkbmap com pouco sucesso.

Aqui está minha tentativa de usar o xmodmap:

# ~/.xinitrc
xmodmap ~/.xmodmap

e

# ~/.xmodmap
remove Lock = Caps_Lock
keysym Caps_Lock = Escape

Correr a $ xmodmap ~/.xmodmappartir da linha de comando funciona e faz o que eu quero. O problema é que isso é redefinido toda vez que x é reiniciado. É aí que eu espero que o xinitrc entre - ele não deveria carregar toda vez que x inicia e executa o comando xmodmap? Se o comando funcionar, por que não faz nada quando lido de um arquivo?

Eu tentei algumas coisas com setxkbmap, nenhuma das quais funcionou. As duas tentativas abaixo estavam no arquivo em horários separados.

# ~/.xinitrc
setxkbmap -option caps:esc     # attempt 1
setxkbmap -option esc:nocaps   # attempt 2

Nenhum dos comandos fez nada perceptível na linha de comando, portanto, estou assumindo que entendi errado. Gosto da ideia desta solução, porque é uma linha e não requer nada em outro arquivo. Se ao menos funcionasse.

.Xinitrc é o arquivo errado para ser usado? Eu sei que o startx está carregando de ~ / .xinitrc.

Solicito que as soluções possíveis contenham o (s) arquivo (s) inteiro (s), não apenas uma linha (se mais de uma for necessária no arquivo), para não atrapalhar nenhuma etapa intermediária. Por exemplo, se eu precisar de algo em .xinitrc e algo em .xcapsrebind, mostre os arquivos e todo o conteúdo necessário (também posso receber instruções para anexar algo ao final, mas se um & ou similar for necessário, por favor, diga).

ethanmad
fonte
2
Em .xinitrc:setxkbmap -option caps:escape
jasonwryan
1
Correndo xmodmapem .xinitrcdeve funcionar. É o que eu faço. Talvez mapeie algo incomum, para garantir que ele esteja em execução quando você iniciar o x? Além disso, qual gerenciador de janelas / ambiente de área de trabalho você usa? O KDE periodicamente "corrige" o mapeamento do meu teclado sem que eu precise. Talvez verifique as configurações da área de trabalho para garantir que não haja nada correndo xmodmappelas suas costas.
yellowantphil
jasonwryan: Tentei isso tanto no .xinitrc; não funcionou. Funcionou a partir da linha de comando! Então, há um começo. Eu acho que yellowantphil está certo - ~/.xinitrcnão está fugindo. Estou usando o i3wm e não o DE no momento, embora o mesmo acontecesse no Pantheon quando tentei. Até onde eu sei, o i3 não mexe com o xinitrc ou carrega o seu próprio (mas eu sou um noob, então o que eu sei?).
precisa saber é o seguinte
Você também pode tentar incluir Option "XkbOptions" "caps:escape"em um Xarquivo de configuração do teclado, por exemplo/etc/X11/xorg.conf.d/10-keyboard.conf
don_crissti

Respostas:

5

EDIT: Como um usuário útil apontou, minha solução inicial não sobreviverá a uma atualização. Sua solução nos comentários deve funcionar. Se você preferir trocar Caps Lock e Escape, recomendo adicionar os seguintes comandos da sua configuração .xinitrc ou i3:

.xinitrc:

xmodmap -e "clear lock"
xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
xmodmap -e "keycode 66 = Escape NoSymbol Escape"

arquivo de configuração do i3 (normalmente localizado em .config / i3 / config ou em .i3 / config)

# swap caps lock and escape
exec_always --no-startup-id xmodmap -e "clear lock"
exec_always --no-startup-id xmodmap -e "keycode 9 = Caps_Lock NoSymbol Caps_Lock"
exec_always --no-startup-id xmodmap -e "keycode 66 = Escape NoSymbol Escape"

Sei que essa pergunta é bastante antiga, mas achei que poderia acrescentar uma resposta para aqueles que ainda tentam descobrir isso.

Depois de ter problemas semelhantes com alguns DEs não carregando ~/.xinitrc, evitei o xmodmap por completo, fui /usr/share/X11/xkb/symbolse modifiquei o mapeamento de chave => diretamente.

Para fazer isso, editei o arquivo de configuração do meu teclado localizado em /usr/share/X11/xkb/symbols. Para a maioria dos teclados, esse deve ser o pcarquivo.

Depois de abrir o arquivo, alternei manualmente entre Escape e Caps_Lock para as respectivas teclas, o resultado é mostrado abaixo). Como isso afeta a forma como o X mapeia o hardware para o símbolo-chave, ele deve funcionar independentemente de você estar no GNOME ou i3 ou algo assim.

Um trecho do meu arquivo resultante é o seguinte:

default  partial alphanumeric_keys modifier_keys

xkb_symbols "pc105" {

    key <ESC>  {        [ Caps_Lock             ]       };

    // The extra key on many European keyboards:
    key <LSGT> {        [ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {        [ backslash,    bar     ]       };
    key <SPCE> {        [        space          ]       };

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {        [ BackSpace, BackSpace  ]       };

    key  <TAB> {        [ Tab,  ISO_Left_Tab    ]       };
    key <RTRN> {        [ Return                ]       };

    key <CAPS> {        [ Escape                ]       };
    key <NMLK> {        [ Num_Lock              ]       };

    key <LFSH> {        [ Shift_L               ]       };
    key <LCTL> {        [ Control_L             ]       };
    key <LWIN> {        [ Super_L               ]       };

    key <RTSH> {        [ Shift_R               ]       };
    key <RCTL> {        [ Control_R             ]       };
    key <RWIN> {        [ Super_R               ]       };
    key <MENU> {        [ Menu                  ]       };

Isso funcionou como um encanto para mim.

Ao pesquisar os arquivos relacionados, encontrei menções repetidas e implementações parciais de algum tipo de sinalizador usado para alternar certas teclas, como trocar Escape e Caps Lock. Suponho que é isso que a Ferramenta Gnome Tweak e o setxkbmap usam; no entanto, não consegui descobrir como manter essas sinalizações no gerenciador de janelas i3. A solução acima deve funcionar bem.

Espero que isso resolva o problema!

capsloch
fonte
na sua configuração do i3:exec --no-startup-id setxkbmap -layout whatever -variant whatever -option caps:escape
quixotic,
observar as alterações ao sistema de ...xkb/symbols/pcarquivo será substituído na próxima vez xkeyboard-configou xkb-datapacotes são atualizados.
quixotic
1

Duas possibilidades:

1) .xinitrcnão está sendo executado - é usado pelo xinit, startx e alguns outros métodos para iniciar sessões X, mas não é universalmente suportado - você pode estar usando um gerenciador de exibição que não o executa. Adicionar algo ao .xinitrc, como touch /tmp/xinitrc-was-runpode ajudar a determinar se é esse o caso.

2) O Xorg redefine automaticamente as configurações padrão quando nenhum cliente está conectado - se o .xinitrc terminar antes que o gerenciador de janelas ou qualquer outra coisa comece a ser executada, as alterações xmodmap ou setxkbmap serão perdidas.

Se já houver uma opção XKB definida que você deseja usar, em vez de executar programas para alterar a configuração toda vez que o Xorg for iniciado, basta dizer ao Xorg para iniciar as configurações corretas. Por exemplo, para ativar as teclas Ctrl-Alt-Backspace para matar meu Xserver, instalei um arquivo chamado /etc/X11/xorg.conf.d/90-zap.confque contém:

# This configuration snippet enables the Ctrl-Alt-Backspace server kill key
# 
# To use it, link or copy into /etc/X11/xorg.conf.d/
#
# Note that only the last XkbOptions setting seen for a device will be used,
# so to use multiple options, copy this file and add options into the Option
# string, such as "terminate:ctrl_alt_bksp,ctrl:swapcaps"

Section "InputClass"
    Identifier "keyboard zap by default"
    MatchIsKeyboard "on"

    Option "XKbOptions" "terminate:ctrl_alt_bksp"
EndSection

Você pode ler mais sobre isso nos documentos X.Org em https://www.x.org/releases/X11R7.7/doc/xorg-docs/input/XKB-Config.html .

alanc
fonte