Xmodmap permanente no Ubuntu 13.04

72

Não consigo executar o xmodmap no login no Ubuntu 13.04. Eu pesquisei, inclusive no askubuntu e todas as respostas que encontrei não funcionam.

Eu tenho um arquivo chamado .Xmodmap na minha pasta pessoal que contém os mapeamentos desejados. Se eu executá-lo manualmente, ele funciona bem, então não há erro lá. Para executá-lo na inicialização, tentei:

  1. Usando vários .xinitrccontendo um dos seguintes comandos:

    • xmodmap .Xmodmap
    • xmodmap ~/.Xmodmap
    • /usr/bin/xmodmap /home/NAME/.Xmodmap
    • if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
      fi
  2. Usando em .Xresourcesvez de .xinitrccom as mesmas variações.

  3. Configurando-o como um aplicativo de inicialização.

Nenhuma das opções acima funciona no Ubuntu 13.04 (64 bits). Também vi algumas idéias sobre como alterar globalmente os mapeamentos de teclado, mas a maioria não era aplicável no Ubuntu 13.04 (ou seja, os arquivos correspondentes não existiam onde especificado) e prefiro não tocar nas configurações globais de qualquer maneira.

Alexander Karatarakis
fonte

Respostas:

81

O Ubuntu não usa mais xmodmap, mas usa xkb(pelo que entendi, isso facilita os layouts de teclado por janela, entre outras coisas).

Os arquivos de mapa em todo o sistema estão em

/usr/share/X11/xkb/symbols/

Os mapas parecem ser carregados hierarquicamente, com o pcmapa como raiz e qualquer idioma (por exemplo en) como filho da raiz.

No meu caso particular, troquei fisicamente Page Up com Home e Page Down com End no teclado, para que fiz alterações muito grosseiras no pcmapa de todo o sistema , da seguinte maneira:

 key <HOME> {    [  Prior        ]   };
 key <PGUP> {    [  Home         ]   };
 key  <END> {    [  Next         ]   };
 key <PGDN> {    [  End          ]   };

NOTA: Para forçar o Xorg a usar seu novo mapa do teclado, talvez seja necessário remover os mapas pré-compilados existentes (* .xkm) em

/var/lib/xkb/

e depois reinicie o Xorg.

Existem vários recursos xkb, mas este está relacionado ao Ubuntu.

Daniel
fonte
9
A partir do Ubuntu 14.04, essa é, infelizmente, a maneira mais fácil de trocar chaves. Você PODE executar o xmodmap rodando no login adicionando-o aos Aplicativos de Inicialização, mas se você suspender, hibernar, etc, deverá iniciá-lo manualmente ou criar scripts do daemon de inicialização.
21914
Eu posso remapear teclas dependendo modificadores: unmodified shift altgr* shift+altgr. Mas left alte quanto super key?
Farzher
7
Não acho que sua primeira frase seja verdadeira. Você tem alguma fonte para isso? Acho difícil acreditar que "a maneira do Ubuntu" de remapear suas chaves esteja editando os mapas do teclado xkb. Além de enigmático, há o problema de que seus mapas personalizados sejam excluídos quando xkbatualizados.
Mateus Araújo
11
Dito isto, este é o único método confiável que eu encontrei para remapear as chaves no Ubuntu.
Mateus Araújo
11
Tem que haver uma maneira melhor. Eu sei o código-chave exato que quero mapear, mas o código-chave 217 nem está listado no xkb. Eu nem vejo uma maneira de adicionar novos códigos de chave.
Jonathan
13

Para mim, a configuração do xkb é muito complicada se você deseja remapear 1 ou 2 chaves de uma maneira que não está disponível nas Configurações do sistema. Além disso, a solução deve permanecer do lado do usuário, sem editar '/ usr / share / X11 / xkb / symbols /' etc. Forçar o carregamento 'xmodmap ~ / .Xmodmap' usando os Aplicativos de Inicialização só funciona até você suspender, alterar usuários ou altere o layout do teclado. Portanto, como sugere o holocronweaver, com os trechos de código que encontrei, criei um script python para ser carregado na inicialização da sessão, que recarrega o '~ / .Xmodmap' quando necessário.

Verifique o relatório de bug # 1243642 (comentário # 6) e faça o download aqui .

dedalu
fonte
11
Ainda trabalhando a partir de 15.10 :-) Obrigado!
Lalomartins
O link para esse script lendário parece estar quebrado. Alguém poderia colocar no github?
Epigene
Ótima - e apenas viável - resposta! Trabalhando em 16.04. Para fazê-lo funcionar no Python3, foi alterado: "import gobject" para "de gi.repository import GObject as gobject".
Craig Hicks
11
@Epigene - o link está lá agora
Craig Hicks
Louvor seja! Um gênio contornar.
dmanexe
6

Eu tive esse problema no Ubuntu 14.04 e encontrei a solução aqui . Aparentemente, o Ubuntu não é capaz de configurar o teclado imediatamente após o login, mas é um pouco mais tarde. Então, se você adicionar um comando

sleep 4 && xmodmap ~/.Xmodmap &

para ~/.bash_profileentão deve funcionar (funciona para mim).

EDIT: Isso parece funcionar somente após o login, não após a inicialização. Vou ter que investigar isso mais tarde.

dremodaris
fonte
11
Alguma sorte definindo isso para executar após suspender / hibernar?
Jonathan
Não, infelizmente ainda não consigo fazê-lo funcionar após a inicialização. Então, toda vez que eu inicializo, abro um terminal e digito xmodmap ~/.Xmodmap:(
dremodaris
estar ciente de que no Ubuntu 16.04 você deve usar .profile
Vitor Abella
5

Converter Caps Lockem Escpara vimuso

Aqui está minha variante de um script de inicialização de mapeamento de chaves. Ele se converte Caps Lockem Escqualquer teclado para uso com vi, vimou gvim.

Diferente da resposta de q4w56 , essa resposta não usa nenhum while; doloop infinito . Caso contrário, um núcleo da minha CPU dual core atingiria 42% a cada 5 segundos, reduzindo severamente a carga da bateria do meu laptop.

#!/usr/bin/env bash
sleep 4
xmodmap -e "clear Lock"
xmodmap -e "keysym Caps_Lock = Escape"

Salve-o como um script. Torne o arquivo executável com chmod +x. Adicione o nome e o local do script em Session and Startup → Application Autostart(no Xubuntu).

O comportamento do teclado para esse usuário permanecerá persistente durante a reinicialização e o logout, mas não a suspensão. A persistência através da suspensão pode ser alcançada , mas infelizmente apenas no nível do sistema, não prontamente no nível do usuário.

Justificativa para este remapeamento do teclado

No mundo da computação de hoje, resta muito pouco uso para a Caps Lockchave. Em geral, deve-se evitar o uso de ALL CAPS em virtude da netiqueta e da separação da apresentação e do conteúdo . Além disso, pressionar a Caps Locktecla acidentalmente durante a edição de texto vimnem sempre é notado imediatamente, mas invariavelmente resulta em um comportamento bastante irritantevim mais adiante. Desabilitar a Caps Lockchave e reutilizá-la como um fácil de alcançar Escresulta em uma vitória dupla para vimuso.

Serge Stroobandt
fonte
Substituir a função da Caps Lockchave pode salvar a vida real dos vimusuários nos Apple MacBooks sem uma Escchave .
Serge Stroobandt 27/10
3
É melhor remapear o arquivo capslockpara ctrl. Isso resolve muitos outros problemas e, no Vim, você pode usar capslock+ [para EscDesculpe por se intrometer, mas me senti obrigado a sugerir isso.
user907860
O que exatamente é suspender? Isso está fechando a tampa do seu laptop? Depois disso, sua solução não funciona? Como você usa o vim depois de fechar a tampa do seu laptop?
Marko Avlijaš
@ MarkoAvlijaš How do you use vim after you close the lid on your laptop?Ao abrir a tampa, é claro!
Serge Stroobandt
Haha, eu nunca imaginaria isso. Quero dizer caps lock não está mais mapeado para esc depois disso?
Marko Avlijaš
3

Eu também tive o problema no Ubuntu 16.04 com o fcitx e tinha a solução no wiki do fcitx , mas ele precisa do fcitx 4.2.7 ou posterior

  • touch ~/.Xmodmap
  • escreva a configuração
  • reinicie e o fcitx tentará carregá-lo automaticamente

Também há algumas explicações para o motivo.

Bluethon
fonte
11
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Videonauth
@Videonauth eu modifiquei a minha resposta
Bluethon
Muito obrigado :) Deixo o meu comentário aqui ainda para que as pessoas na revisão possam ver que você mudou alguma coisa.
Videonauth
@Videonauth, esta é minha primeira resposta e sou péssima em inglês, por isso cometi algumas falhas. e obrigado pelo seu conselho. : P
Bluethon
De nada. Fornecer respostas é uma boa maneira de contribuir para a comunidade.
Videonauth
3

A resposta de @ Daniel me apontou o caminho certo, mas eu gostaria de estendê-lo.

Funciona para mim no Linux Mint 17.2 e Ubuntu 16.04.

Tentei todas as reviravoltas que consegui continuar usando xmodmap, mas todas falham quando o sistema entra no modo de suspensão. O mesmo vale para scripts de inicialização de aplicativos que são usados setxkbmapnos casos em que o * settings-daemon (para mim é xfce4) é executado mais tarde que o script - e a ordem não pode realmente ser influenciada.

O que eu finalmente criei tem os seguintes ingredientes:

1) Escreva um arquivo de mapeamento de teclado mínimo para /usr/share/X11/xkb/symbols. Vamos chamar o arquivo mylayout. Pode ser tão simples quanto

xkb_symbols "basic" {
  name[Group1] = "My Layout";
  include "us"
  key <AE03> { [ 3, numbersign, sterling, sterling] };
  include "level3(ralt_switch)"
}
  • basic é apenas um nome, vamos encontrá-lo mais tarde novamente.
  • Da name[Group1]mesma forma, é apenas um nome que parece, mas não desempenhará nenhum papel mais tarde.
  • include "us"inclui o teclado simples dos EUA. Na verdade, usé outro arquivo no mesmo diretório. Este é o layout do teclado que estamos adaptando. Escolha um diferente, conforme necessário. Nota: sem ponto e vírgula para finalizar esta linha.
  • A keylinha é uma adaptação do teclado, mais pode seguir. O <AE03>pode ser encontrado nos arquivos em /usr/share/X11/xkb/keycodes. Use o xevprograma para descobrir que a tecla "3" possui o código 12 e no arquivo de códigos para o Xfree86qual é mapeado <AE03>.
  • Finalmente, outra includediretiva para ativar outra opção de teclado, neste caso, quero que a tecla Alt correta seja a tecla shift de nível 3, ou seja, a tecla que dá acesso ao sterlingsinal que eu defini acima. level3é apenas um nome de arquivo na mesma pasta com ralt_switchuma seção. Dê uma olhada e escolha o que você precisa incluir.

2) Não coloquei o mylayoutarquivo na pasta do sistema. Em vez disso, criei apenas um link virtual da pasta do sistema para uma pasta do meu agrado para ver imediatamente que esse não é o software padrão.

3) Além disso, eu não consertei evdev.xml, novamente para evitar problemas de atualização. Mas isso seria necessário para encontrar o mylayout no editor de configuração do teclado (para o xfce4 xfce4-keyboard-settings). Em vez disso, usei xfce4-settings-editore mudei keyboard-layout->XkbLayoutpara mylayout(o nome do arquivo) e XkbVariantpara basic(veja acima). Depois, também mylayout/basicé exibido no editor de configurações do teclado. Uma entrada em evdev.xmlparece ser necessária apenas para poder selecionar o layout.

Dessa forma, as configurações do teclado agora sobrevivem ao modo de suspensão e reiniciam.

Mais informações podem ser encontradas aqui: http://www.charvolant.org/~doug/xkb/html/node5.html .

Outra abordagem para corrigir o problema do modo de suspensão (não tentei por mim mesmo) pode ser encontrada aqui: https://www.vinc17.net/unix/xkb.en.html .

UPDATE: trabalhei com o Mint 18.3 no mesmo momento em que alterei as configurações no xfce4-settings-editor como descrito acima.

ATUALIZAÇÃO: Com 18.04, gdm3 como gerenciador de exibição e XFCE4 como gerenciador de janelas, parece que ~ / .Xmodmap é lido novamente e as configurações parecem sobreviver a uma suspensão. (Eu raramente uso suspend e nunca tenho certeza de qual modo o laptop está realmente).

Harald
fonte
2

REVISÃO

Uma atualização no início de 2018 quebrou a persistência - recarregamento automático do mapa de teclas após a suspensão ou hibernação. Como os métodos que usam scripts /etc/pm/sleep.d pararam de funcionar (descontinuados?), Isso deixou apenas o caminho mais recente, usando / lib / systemd / system-sleep e scripts ligeiramente diferentes (que começaram a trabalhar nos mapas de teclas!).

Portanto, esta postagem é atualizada para o método mais recente de persistência e para incluir o carregamento inicial normal do mapa de teclas, que também começou a funcionar. A rotina para converter um arquivo .Xmodmap em .xkbmap permanece inalterada.

Observe que esta é uma solução por usuário. Para obter uma resposta por dispositivo, veja como aplicar um mapa de teclas a um único dispositivo . Este método pode ser adaptado para uso aqui.

Primeiro modifique o arquivo .Xmodmap conforme desejado. É mais fácil editar diretamente do que arquivos .xkbmap. Quando está carregado:

xmodmap .Xmodmap

depois converta para um arquivo .xkb:

xkbcomp $ DISPLAY $ HOME / .xkbmap

Para carregar automaticamente na inicialização, abra Aplicativos de Inicialização, clique em Adicionar e, na linha de Comando, digite:

xkbcomp /home/user/.xkbmap ": 0"

("usuário" é substituído pelo nome de usuário real.) Para Nome, talvez insira Carregar mapa do teclado. Adicione um comentário, se desejar, e clique em Salvar.

O mapa de teclas agora será carregado toda vez que o sistema inicializar, mas não sobreviverá a uma suspensão ou hibernação. Para isso, crie um novo arquivo em / lib / systemd / system-sleep, talvez chamado 60_xkbmap, que contenha:

#!/bin/sh
case $1/$2 in
  pre/*)
    # Place pre-suspend commands here
    exit 0
    ;;
  post/*)
    # Place post-suspend commands here
    export DISPLAY=":0"
    export XAUTHORITY="/home/user/.Xauthority"
    su user -c "xkbcomp /home/user/.xkb/xkb-map $DISPLAY 2>/dev/null"
    ;;
esac

( Ref. ) Como acima, substitua "usuário" pelo nome de usuário real.

O mapa de teclas agora deve carregar automaticamente e permanecer persistente. Nota:

  • Aplica-se à versão atual do LTS, 16.04, e provavelmente mais tarde também.
  • Retirado do post 14 do tópico de bug vinculado acima.
  • Comentários anteriores aplicados à postagem original.
u2n
fonte
Estou tentando este método agora e agora, quando inicio um terminal, recebo várias mensagens assim: Aviso: Nenhum símbolo definido para <AB11> (código de chave 97) Aviso: Nenhum símbolo definido para <JPCM> (código de chave 103) Aviso: Nenhum símbolo definido para <I120> (código de chave 120) ...... muitos mais não sabem ao certo quais serão as consequências disso. Ninguem sabe?
bebê perdido
Este método, apesar dos avisos mencionados acima, funciona apenas temporariamente - depois de algum tempo o mapeamento é esquecido e a super tecla retorna à sua função padrão. Então, vou tentar o contrário - vou remapear os atalhos básicos de edição no meu mac para usar a tecla Control em vez da tecla Command e ver se isso funciona. Eu só quero que meus comandos cortar-copiar-colar-desfazer-refazer sejam os mesmos no Mac e no Ubuntu. Fico muito frustrado quando o menu de pesquisa aparece no Ubuntu toda vez que tento copiar ou colar algo.
bebê perdido
1

Isso também me fez tropeçar quando atualizei do Ubuntu 12.04 para 13.04.

Felizmente, essa configuração está agora (ou talvez sempre tenha sido) facilmente acessível nas preferências do teclado e pode ser alterada com apenas alguns cliques do mouse.

  1. Vá para Configurações do sistema > Layout do teclado > Opções ...
  2. Nas Opções de layout do teclado, clique na seta para exibir as opções de posição da tecla Ctrl .
  3. Coloque a marca de seleção em Swap Ctrl e Caps Lock .

Aí está: o controle esquerdo e o Caps Lock mudaram de posição.

Não se esqueça de excluir ~/.Xmodmapdepois de fazer a alteração.

glts
fonte
Talvez isso tenha sido diminuído porque não aborda o xmodmap, mas foi assim que descobri que usar o Gnome Tweak pode ter sido a razão pela qual alguns dos meus mapeamentos estavam agindo de forma estranha.
dragon788
Não vejo isso em 16.04, isso ainda é possível?
Chrismarx #
11
@chrismarx Não, eles o removeram. Hoje em dia (16.04) eu definir XKBOPTIONS="ctrl:swapcaps"no /etc/default/keyboard.
MLDs
0

Acho que a adição desse script à inicialização é satisfatória:

while true;do 
    xmodmap -e "keycode 87=Prior"
    xmodmap -e "keycode 88=Next"
    sleep 5
done

Eu tentei usar xmodmap ./Xmodmap, mas toda vez que é executado, um atraso perceptível ocorrerá.

golopot
fonte
4
O uso de qualquer while; doloop infinito deve ser evitado. Isso fez com que um núcleo da minha CPU dual core atingisse 42% a cada 5 segundos, reduzindo severamente a carga da bateria do meu laptop!
Serge Stroobandt