Como remapear permanentemente caps lock para esc em X11?

6

Eu quero remapear o caps lock para escapar de em X11 (ou seja, pressionar o botão físico caps lock será interpretado como esc pelas aplicações e o comportamento de esc não será alterado). A solução deve sobreviver a um X restart . xmodmap e setxkbmap são soluções aceitáveis (como programas semelhantes). 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 eu estiver faltando uma solução melhor / mais fácil / mais óbvia, por favor, me diga, mas note que eu não estou usando um DE (experimentando o i3wm).

Até agora eu 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

A execução de $ xmodmap ~/.xmodmap 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 - não deveria carregar toda vez que x inicia e rodar o comando xmodmap? Se o comando funcionar, por que ele não faz nada quando lido de um arquivo?

Eu tentei algumas coisas com o setxkbmap, e nenhuma delas funcionou. As duas tentativas abaixo estavam no arquivo em momentos separados.

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

Nenhum comando fez nada perceptível na linha de comando, então estou assumindo que entendi errado o comando. Eu gosto da idéia desta solução porque é um one-liner e não requer nada em algum outro arquivo. Se ao menos funcionasse.

É .xinitrc o arquivo errado a ser usado? Eu sei que o startx está carregando de ~ / .xinitrc.

Eu solicito que soluções possíveis contenham o (s) arquivo (s) inteiro (s), e não apenas uma linha (se mais de uma for necessária no arquivo) para que eu não atrapalhe um passo intermediário. Por exemplo, se eu precisar de algo em .xinitrc e algo em .xcapsrebind, por favor, mostre os arquivos e todo o conteúdo requerido (eu também posso manipular a mensagem para acrescentar algo ao final, mas se um & ou similar puder ser necessário , por favor me diga).

    
por ethanmad 29.04.2015 / 02:53

2 respostas

3

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, eu recomendaria adicionar os seguintes comandos a partir do seu .xinitrc ou do i3 config:

.xinitrc:

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

arquivo de configuração 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"

Eu percebo que essa pergunta é bem antiga, mas pensei que poderia adicionar uma resposta para aqueles que ainda estão tentando descobrir isso.

Depois de ter problemas semelhantes com alguns DEs não carregando ~/.xinitrc , eu evitei o xmodmap completamente, fui para /usr/share/X11/xkb/symbols e modifiquei o mapeamento de símbolos key = > diretamente.

Para 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 arquivo pc .

Depois de abrir o arquivo, eu mudei manualmente em torno de Escape e Caps_Lock para suas respectivas chaves, o resultado é mostrado abaixo. Como isso afeta como o X mapeia o hardware para o símbolo da chave, ele deve funcionar independentemente de você estar no GNOME ou no i3 ou algo assim.

Um fragmento 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 olhar em volta dos arquivos relacionados, encontrei repetidas menções e implementações parciais de algum tipo de sinalizador usado para alternar certas chaves, como trocar Escape e Caps Lock. Eu suponho que isto é o que a Ferramenta Gnome Tweak e o setxkbmap usam; no entanto, não consegui descobrir como manter esses sinalizadores com o gerenciador de janelas do i3. A solução acima deve funcionar bem.

Espero que isso corrija o problema!

    
por 26.02.2018 / 21:12
1

Duas possibilidades:

1) .xinitrc nã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 utiliza executá-lo. Adicionar algo a .xinitrc, como touch /tmp/xinitrc-was-run , pode ajudar a determinar se esse é o caso.

2) O Xorg automaticamente redefine para as configurações padrão quando não há clientes conectados - se o .xinitrc terminar antes do gerenciador de janelas ou qualquer outra coisa começar a ser executada, as alterações do xmodmap ou do setxkbmap serão perdidas.

Se houver uma opção XKB já definida que você deseja usar, ao invés de executar programas para alterar a configuração toda vez que o Xorg for iniciado, você pode apenas dizer ao Xorg para iniciar com as configurações corretas. Por exemplo, para permitir que as teclas Ctrl-Alt-Backspace matem meu Xserver, instalei um arquivo chamado /etc/X11/xorg.conf.d/90-zap.conf , que 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 do X.Org em link .

    
por 28.02.2018 / 23:37