No Linux, como posso mapear SHIFT_L / SHIFT_R quando pressionado sem chave adicional?

13

Hoje encontrei este artigo muito legal de Steven Losh, no qual ele apresenta um par de mapeamentos de teclado que aumentam a produtividade. Entre eles, está um mapeamento dinâmico das teclas shift esquerda e direita.

A ideia

Quando Shift_L ou Shift_R são pressionados sem uma chave adicional, eles são mapeados para '(' e ')' respectivamente, caso contrário, eles funcionam normalmente.

O problema

Ele faz tudo isso sob o OSX. Eu estou tentando conseguir o mesmo no Linux. Não existe um caminho direto para isso, pois, como eu entendo, você não pode usar o xmodmap para configurar uma chave apenas para Shift_L e outra para Shift quando usada como uma tecla modificadora.

Eu pesquisei um pouco e encontrei pessoas tentando fazer o mesmo no Windows, o que é aparentemente possível usando o AutoHotKey, mas não consegui encontrar nada para o Linux.

Existe uma maneira de resolver isso no Linux?

gilligan
fonte
Eu não tentei, mas isso pode ajudar askubuntu.com/q/24916/11352
Mansuro
2
É quase duplicado para esta questão . =)
teika kazura

Respostas:

4

Uau! Comentário do usuário teika kazura sobre a questão original é bastante correto - não só é efetivamente uma duplicata dessa outra questão , mas a resposta fornecida lá ("use xcape ") resolve este problema!

Depois de clonar o repositório xpo e compilar (eu tive que instalar o libXtst-devel na minha caixa do Fedora, primeiro), consegui obter o comportamento exato solicitado com o seguinte comando:

xcape -e "Shift_L=parenleft;Shift_R=parenright"

Depois de testes reconhecidamente superficiais, parece funcionar muito bem. Agradável!

Outras opções

Se você usar a tecla Shift como um modificador do mouse (ou seja, se você clicar em qualquer coisa), você provavelmente desejará incluir a opção de tempo limite do xcape e encontrar um valor de tempo limite confortável, para que as teclas Shift sejam usadas em combinação com o mouse don geram parênteses espúrios. A partir do xcape README:

-t <timeout ms>

Se você mantiver uma chave por mais tempo do que esse tempo limite, o xcape não gerará um evento chave. O padrão é 500 ms.

Assim, ao incluir o -tsinalizador com um valor de tempo limite que funcione para você, você ainda poderá clicar com o mouse enquanto você mantiver pressionada a tecla Shift por pelo menos timeout ms milissegundos.

(Crédito, novamente, para teika kazura por apontar a outra questão, e também para don_crissti pela resposta original lá.)

FeRD
fonte
Um problema com esse método é que eu frequentemente pressiono [Shift] + [LMouse] para selecionar algum texto nos editores. Texto Interessante Sublime também usa [Ctrl] + [LMouse] então a questão sobre remapear [Ctrl] também causa problemas.
Annan
@Annan Você já experimentou ajustar a opção de tempo limite do xcape? No README: " -t <timeout ms>Se você mantiver uma chave por mais tempo do que esse tempo limite, o xcape não gerará um evento de chave. O padrão é 500 ms." ... A menos que o xcape interfira no evento de teclas do modificador (não me lembro), isso deve impedir que ele gere pressionamentos de tecla falsos, enquanto ainda permite usá-lo como um modificador de seleção de mouse, desde que você o mantenha por tempo suficiente .
FeRD
@Annan Isso é ótimo para ouvir, eu atualizei a minha resposta para sugerir a utilização da -tbandeira!
FeRD
1

É um desafio interessante, e eu concordo que o xinput não parece ser perfeitamente adequado. Passei algum tempo mexendo nas habilidades do xmodmap, e cheguei tão frustrantemente perto de conseguir o que você quer fazer ... sem realmente conseguir chegar lá.

Usando o xmodmap, é possível atribuir o parenleft como um símbolo de teclas na tecla left-shift:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'

qual sorta funciona, pelo menos em testes na minha caixa do Fedora 17, mas não de forma satisfatória. Descobri que, com esse mapeamento em vigor, a tecla Shift ainda funcionava normalmente e não apresentava nenhum parêntese espúrio, mas (frustrantemente) não produzia de forma confiável os parênteses esquerdos. Por alguma razão, a chave não aparecem para modificar de forma confiável em si , que quebra sua atribuição mudou ... inicialmente. Por alguma razão, bater o deslocamento para a esquerda algumas vezes sucessivas acabaria fazendo com que ele começasse a produzir parêntesis esquerdos, mas somente após a quarta ou quinta impressão.

Um comportamento que notei, no entanto, é que você poderia trabalhar com um analógico "próximo o suficiente": descobri que depois de mapear parenleft e parenright para Shift_L e Shift_R, eu poderia digitar parens de maneira confiável "rolando" em ambas as teclas shift - em outras palavras, com esse mapeamento:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'
xmodmap -e 'keysym Shift_R = Shift_R parenright Shift_R parenright'

pressionando Shift_L seguido por Shift_R, então liberando ambos, produziria um parênquima direito, ou um parênquima esquerdo na outra direção. (É claro que os mapeamentos de parêntese poderiam ser revertidos; eu não conseguia decidir qual caminho me pareceria mais "natural".)

Isso foi o mais perto que cheguei de alcançar o comportamento exato que você está procurando; não parece ser possível usar o xmodmap sozinho.

Eu estava meio convencido de que simplesmente não é possível, mas eu percebi que há pelo menos uma tecla que funciona exatamente como você descreve: A tecla Super ("Windows"). Sob o Gnome Shell, é uma tecla modificadora (mod4), que produz um efeito diferente (triggering Overview) quando pressionada sozinha. Assim, pelo menos em teoria, pode ser possível implementar a sobrecarga de teclas de deslocamento desejada da mesma maneira.

... Mas, eu não tenho absolutamente nenhuma idéia de como isso seria feito, ou o quão invasivo seria ficar atolado no processamento necessário toda vez que você apertar a tecla Shift. :-)

FeRD
fonte