Como remapear certas chaves ou dispositivos?

236

Estou procurando uma maneira de remapear certas chaves no ubuntu.

ie

Eu gostaria de mudar PgUppara Homeou PgDownpara End.

Existe um comando interno ou uma ferramenta para reatribuir chaves no Ubuntu / GNOME?

NES
fonte
confira minha resposta aqui . Não vale copiar e colar a mesma resposta. Talvez isso te ajude.
Rahul Virpara
1
Alguma ligação tipo Emacs aqui para CTRL-P / N para etapas de unidade?
Léo Léopold Hertz
Desde que algum tempo xmodmapé privado! para obter uma configuração de todo o sistema que você precisa usar xkb. Portanto, edite o arquivo de idioma /usr/share/X11/xkb/symbols/para adicionar suas alterações. Veja askubuntu.com/a/898462/34298
rubo77

Respostas:

249

Aviso: A partir de 2013, o Ubuntu e os derivados não usam mais xmodmap, mas usam xkb. Para mais informações, consulte esta resposta . A resposta abaixo não é mais relevante para os lançamentos atuais.


Para remapear determinadas chaves, você precisa de duas ferramentas. Primeiro xev (ferramenta de linha de comando) e segundo xmodmap (também ferramenta de linha de comando). Ambos devem estar disponíveis no Ubuntu sem a instalação extra.

  1. Inicie a janela do terminal e execute xev. Agora está ativo e espera que você pressione uma tecla. Em seguida, pressione a tecla cujo comportamento você deseja alterar. ie PgUp.

  2. xevproduzirá algumas informações sobre a tecla pressionada. A terceira linha é importante. Deve ser semelhante a:

    state 0x10, keycode 110 (keysym 0xff55, Prior), same_screen YES,
    

    Neste exemplo, Prioré o nome do comportamento ao qual a chave está atribuída no momento, o número do código-chave é o ID interno para reconhecer a chave. Agora faça isso com outra tecla, ou seja, PgDowndê essa saída

    state 0x10, keycode 115 (keysym 0xff56, Next), same_screen YES,
    

    Aqui, novamente, a parte interessante para nós é keycode 115e Next- o nome do comportamento.

  3. Agora, quando você quiser trocar as duas chaves, use xmodmap.

     xmodmap -e "keycode 110 = Next"
    

    Isso altera a tecla com o código de tecla 110 no teclado para a ação Next. É bem simples.

    Observe que se a tecla que você está mapeando deve ter um significado diferente quando usada com a Shifttecla (por exemplo, layouts de teclado britânicos, Shift+ 2fornece aspas), basta listar o comando secundário após o primeiro. Por exemplo, se você deseja que a chave com o código 53 seja mapeada para a barra invertida normalmente, mas para o símbolo de barra quando usado com shift, você pode:

     xmodmap -e "keycode 53 = backslash bar"
    

Informações adicionais: A sequência destes mapeamentos é Key, Shift+Key, mode_switch+Key, mode_switch+Shift+Key, AltGr+Key, AltGr+Shift+Key. Para pular uma coluna, use NoSymbol. Além disso, aqui está uma lista abrangente de todos os principais ginásios.

Nota: Essas alterações são apenas para a sessão X ativa e serão perdidas após a reinicialização. Quando você deseja salvar as alterações permanentemente, execute os seguintes comandos após os acima:

xmodmap -pke >~/.Xmodmap

(ele cria um arquivo nomeado .Xmodmapem seu diretório pessoal ( ~))

Então você tem que criar um arquivo chamado .xinitrcem seu diretório home, onde você colocar o comando xmodmap .Xmodmapno.

Agora você pode modificar .Xmodmape executar xmodmap .Xmodmapno console para ver as alterações imediatamente. As alterações .Xmodmappersistirão.

fonte: Ubuntu Foruns

Material bônus:

Se a tecla que você está remapeando tiver um comportamento diferente, dependendo de um estado (como a forma como as teclas do teclado numérico dependem do NumLock), basta xmodmap -pmexecutar uma lista de modificadores para:

xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"

Suponha, por exemplo, que você queira obter um ponto final em vez de vírgula no teclado numérico (útil para a maioria dos programadores), mas deseje manter o comportamento de "exclusão" quando o NumLock estiver desativado.

xmodmap -e "keycode 91 mod2 = KP_Delete period"

mod2, Porque xmodmap -pmnos diz que mod2é Num_Lock, os outros nomes são obtidos pressionando as teclas no xev.

NES
fonte
3
xevnão é capaz de detectar Fnpressões importantes
om-nom-nom
3
A resposta selecionada não funcionou para remapear a tecla Caps-lock para mim no Ubuntu 12.10. Consegui fazer isso acessando Configurações do sistema -> Teclado -> Configurações de layout -> Opções, que possui uma lista de teclas e comportamentos alternativos. Trabalhou perfeitamente no Unity e no terminal.
Allyl Isocyanate 10/10
1
Se você tiver vários teclados conectados, essas ferramentas verão uma diferença entre a mesma tecla em outro teclado?
Stommestack
1
Estranho, fiz tudo, mas minhas impressões de teclas ainda são redefinidas após a reinicialização.
Costa
1
Eu não acho que tenho uma -eventbandeira no Ubuntu 12.04. Ele gera um erro e não menciona "evento" em man xev.
Isomorphismes
20

Se você estiver tentando mover uma tecla Shift, existem algumas etapas extras:

 xmodmap -e "keycode 62 = Up" # Shift => Up
 xmodmap -e "keycode 111 = Shift_R" # Up => Shift
 xmodmap -e "add shift = Shift_R" # Make the new Shift key actually do shifting
 xmodmap -e "remove shift = Up" # Prevent the old Shift key from shifting
 xset r 62 # Make the new Up key autorepeat
 xset -r 111 # Prevent the new Shift key from autorepeating
cmcginty
fonte
+1 A resposta mais unix de todas as respostas para um modificador (eu já havia feito isso desde o meu iBook 2, quando queria que a tecla enter tivesse a função Control_R, mas esqueci os detalhes).
Rbrito
2
Uma resposta importante para os usuários que utilizam teclados em Lenovo Laptops
Einar Olafsson
16

Acabei de pensar um pouco .. acho que você pode significar algo completamente diferente com "remapear" ... mas vou deixar minha resposta como está ... (não sei como reatribuir uma tecla para comportar-se como outro)

ATUALIZAÇÃO : meu 'pensamento tardio' foi confirmado; (Respondi à pergunta errada:) ... consulte a resposta do Wiki da Comunidade do NES (aceita acima).

Existem duas maneiras gerais de remapear uma ligação novamente.

  • localmente para um programa específico
    (uma chave pode ser usada para diferentes coisas em diferentes aplicativos / janelas)
  • globalmente para um usuário específico
    (uma chave tem a mesma função em todas as janelas)

Para métodos 'locais para um programa', às vezes existe uma maneira de alterar as combinações de teclas oferecidas pelo próprio aplicativo ... por exemplo.

Firefoxtem um addon chamado keyconfig ... para mais informações, veja este post do MozillZine

A maioria dos programas Ubuntu são baseados no Gnome e existe um utilitário específico para modificar a combinação de teclas para qualquer item de menu desses aplicativos Gnome ... É chamado Editable Menu Accelerator... É uma ferramenta muito 'delicada', mas bastante poderosa. Você pode ativar executando gconf-editor(via Terminal ou Alt + F2) ... navegue para desktop- gnome- interfacee selecione can_change_accels.... Você pode alterar os itens de menu para virtuais o que quiser (por programa / janela) ... sugiro que desative assim que você tiver feito o que precisa ..

Caso contrário, você pode configurar as teclas de atalho globais. Eu uso um programa chamado xbindkeys Instalar xbindkeys , e também há uma opção disponível no Menu Principal - Preferências, chamadoKeyboard Shortcuts

Se você usa xbindkeys, precisará adicioná-lo aos seus "Aplicativos de Inicialização" (Menu Principal - Preferências) ... Também (como sugerido por Stefano Palazzo), eu escrevi anteriormente uma descrição mais detalhada de xbindkeys em uma resposta sobre isso. página askubuntu

Peter.O
fonte
+1, muito bom! Uma sugestão: você deve integrar sua ótima resposta de outra pergunta a esta, talvez também explique um pouco o formato de configuração do xbindkeys.
Stefano Palazzo
1
O pouco sobre a atribuição de outras chaves pode ser tratado xdotool, confira a página de manual, usei-a para resolver esse problema .
Stefano Palazzo
Recentemente, encontrei outra abordagem com uma ferramenta chamada xmodmap em combinação com uma ferramenta chamada xev. Eu não sei quais são as diferenças entre xmodmap e xbindkeys, mas isso funciona muito bem para mim. algum conselho com ferramenta para preferir dos dois nomeados? Aqui está um guia passo a passo muito útil que descreve o xmodmap e o xev ubuntuforums.org/showpost.php?p=7675138&postcount=2
NES
@NES .. Parece que eu resolvi o ponto errado. Parece que você deseja remapear a maneira como uma tecla específica é interpretada pelo sistema operacional, ou seja, uma interpretação de teclado não padrão, enquanto eu me referi a um interpretação de teclado padrão e simplesmente sobrecarregando as atribuições de teclas padrão. (Eu acho que você está depois é semelhante ao trocar os botões direito do rato esquerda e) .. Bem, parece que a minha resposta foi bom para a coisa errada :)
Peter.O
sim, mas não tem problema. a resposta também é interessante. o guia passo a passo eu postei o link acima era o caminho certo. então postarei uma resposta curta com a solução de que outros usuários têm um bom guia. obrigado fred
NES
9

Aqui está como eu tentei mudar o mapeamento da ENTERchave para a SHIFTchave (e vice-versa):

$ uname -a

RELATÓRIOS:

Linux box 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:35:14 UTC 2011 i686 GNU/Linux

$ which xmodmap

RELATÓRIOS:

/usr/bin/xmodmap

$ which xev

RELATÓRIOS:

/usr/bin/xev

$ xev

(ignore as próximas cinquenta linhas)

PRESS THE ENTER KEY (notice the third line):
KeyPress event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263441120, (738,242), root:(771,314),
    state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
    XLookupString gives 1 bytes: (0d)
    XmbLookupString gives 1 bytes: (0d)
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263441271, (738,242), root:(771,314),
    state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
    XLookupString gives 1 bytes: (0d)
    XFilterEvent returns: False

PRESS THE SHIFT KEY (notice the third line):
KeyPress event, serial 30, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263592202, (464,368), root:(497,440),
    state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263592298, (464,368), root:(497,440),
    state 0x1, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

O importante é a terceira linha de cada pressionamento de tecla:

FOR:
state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
The name "Return" is the name of the behavior of the key pressed.
The number of the key pressed is "36".

state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
The name "Shift_R" is the name of the behavior of the key pressed.
The number of the key pressed is "62".

REVERSE O MAPEAMENTO:

$ xmodmap -e "keycode 62 = Return"
$ xmodmap -e "keycode 36 = Shift_R"

SALVAR OS RESULTADOS:

$ xmodmap -pke > ~/.Xmodmap
$ vi ~/.xinitrc

ADICIONAR, ACRESCENTAR

 xmodmap ~/.Xmodmap

$ sudo reboot

O principal problema foi que a reversão NÃO funcionou. A ENTERchave foi mapeada para a SHIFT_Rchave; mas a SHIFT_Rchave não foi mapeada para a ENTERchave. Vai saber.

Bill Davis
fonte
7

Para fazer remaps globais independentemente do X, você pode usar a instalação do console (5) .

No meu caso, eu queria remapear a Caps Lockchave para D, pois minha Dtecla está quebrada :)

Primeiro, usei dumpkeys (1) para obter um modelo para um mapeamento; no caso da Dtecla -key, o pouco interessante é o mapeamento do código-chave 32 (no meu teclado); Observe que existem dois espaços no padrão grep!

$ sudo dumpkeys | grep "keycode  32" > tempfile
$ cat tempfile
keycode  32 = +d
    shift   keycode  32 = +D
    altgr   keycode  32 = +eth
    shift   altgr   keycode  32 = +ETH
    control keycode  32 = Control_d
    shift   control keycode  32 = Control_d
    altgr   control keycode  32 = Control_d
    shift   altgr   control keycode  32 = Control_d
(121 lines total...)

Para alterar o mapa a ser aplicado Caps Lock(código de tecla 58 no meu teclado), em vez

sed 's/32/58/' -i tempfile

Agora lê

keycode  58 = +d
    shift   keycode  58 = +D
    altgr   keycode  58 = +eth
(etc...)

Para adicionar este remapeamento ao mapa padrão, ele simplesmente precisa ser anexado ao arquivo de inclusão do remapeamento para a instalação do console

sudo sh -c 'cat tempfile >> /etc/console-setup/remap.inc'

e a configuração do console precisa ser reconfigurada (ignorando as perguntas de baixa prioridade -phigh)

sudo dpkg-reconfigure console-setup -phigh

Agora o remapeamento deve ser concluído e carregado automaticamente na inicialização.

arand
fonte
3

Passei um dia inteiro tentando criar um atalho para Ctrl+Pageup.

Eu tentei pela primeira vez, xmodmapmas isso não pode gerar eventos modificadores. Portanto, é impossível criar um atalho que gere, por exemplo, o Controlevento.

Eu então tentei xbindkeyscom xmacro. Isso funciona, mas xbindkeysnão é possível capturar algumas combinações de teclas no meu sistema, como Alt + ___.

Finalmente, usei os Atalhos de teclado do Unity -> Atalhos personalizados para configurar meu atalho.

E, em vez de xmacro, agora usei o xvkbdprograma para gerar os eventos do teclado, mas isso é apenas uma preferência pessoal. Ambos xmacroe xvkbdfuncionam quase da mesma forma. Uma dica adicional é adicionar um parâmetro de atraso xmacroou xvkbdgarantir que os eventos não se percam.

HRJ
fonte
2

Para mim, o AutoKey do Software Center funcionou melhor. Possui interface gráfica intuitiva, para adicionar nova ligação, clique em Novo -> Frase e

  1. Adicionar nome, clique em OK
  2. Na seção "Configurações de frase", verifique se a pasta usando está definida como teclado
  3. Adicione a tecla de atalho que você deseja usar
  4. Adicione um comando no campo de texto, por exemplo, para emular a tecla de seta esquerda - seria <left>(a lista de teclas especiais está aqui ).
ego
fonte
Isso funcionou perfeitamente para configurar Super+Ce Super+Vpara Ctrl+Ce Ctrl+V. Apenas a solução perfeita ao usar o Ubuntu via VirtualBox em um mac
Ben
No entanto, isso não desabilita outros comandos que escutam esses atalhos. Para desativar Super+Vpara "mostrar a lista de notificações", vá para Configuração -> Dispositivos -> Teclado e desative-o lá
Ben
@ Ben sim, seria ótimo se ele exibisse ligações de outros aplicativos, mas é uma cereja no topo do bolo. Meu problema é que não é possível remapear a tecla "Fn". Eu decidi experimentar o teclado uhk - aquela coisa programável independente do sistema operacional, vai ver como vai.
ego
0

Se você precisar remapear uma chave apenas para um programa específico, adicionei esse recurso ao hax11.

Eu gostaria de mudar PgUppara Homeou PgDownpara End.

Para fazer isso com o hax11, abra o arquivo de configuração de perfil do programa em ~/.config/hax11/profiles(por exemplo ~/.config/hax11/profiles/usr\lib\firefox\firefox) e adicione:

Enable=1
MapK112=K110
MapK117=K115
Vladimir Panteleev
fonte