Combinação de teclas específica do aplicativo remapeamento?

18

Estou ciente de várias maneiras de remapear as combinações de teclas no Ubuntu em uma base global (por exemplo, remapear globalmente Ctrl + S para enviar Ctrl + D ou algo assim), como o aplicativo xbindkeys . O que eu preciso, no entanto, é uma maneira de fazer isso apenas para um aplicativo específico . Por exemplo, algo como "Remapear Ctrl + S para enviar Ctrl + D, mas apenas no Chrome ". Existe alguma maneira de conseguir isso?

Derek Thurn
fonte
Você leu este tópico ? Eu não tentei, mas me parece ser exatamente o que você está procurando. Eu não sei o suficiente para escrever uma resposta adequada, no entanto.
Lumbric

Respostas:

12

Sua ideia de usar xbindkeys parece boa:

no seu .xbindkeysrcadicione uma nova combinação de teclas:

"app_specific_keys.sh"
   Control+s

Isso será executado "app_specific_keys.sh"quando você pressionar ctrl+s.

Agora você precisa definir o script. Ele deve obter a janela ativa e a partir daí o nome do aplicativo que atualmente tem o foco:

xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'

Isso faria o truque: solicita ao xdotool a janela ativa, solicita ao xprop todas as propriedades da janela com o ID fornecido e reduz a saída muito detalhada ao nome do aplicativo (na verdade, sua classe). Se você rodar isso em um terminal gnome, você receberá

"Gnome-terminal"

Agora você precisa definir ações para seus aplicativos:

if [ $N = '"Gnome-terminal"' ]; then                                                    
    xdotool key --clearmodifiers ctrl+s                                                          
else                                                                            
    xdotool key --clearmodifiers ctrl+d                                                          
fi  

Então, juntos, o script "app_specific_keys.sh"pode ficar assim:

#!/bin/bash                                                                     
W=`xdotool getactivewindow`                                                     
S1=`xprop -id ${W} |awk '/WM_CLASS/{print $4}'`                                 
S2='"Gnome-terminal"'                                                           
if [ $S1 = $S2 ]; then                                                          
   xdotool key --clearmodifiers ctrl+d                                             
else                                                                            
   xdotool key --clearmodifiers ctrl+s                                          
fi  

Isso deve funcionar, mas, como nesta pergunta , devo admitir que não. Provavelmente porque um dos menus globais do Compiz, Unity, não funciona bem com a --clearmodifiersopção do xdotool. Uma solução alternativa seria adicionar um sono na frente do seu script para poder liberar as chaves você mesmo: Na sua .xbindkeysrcalteração para esta combinação de teclas:

"sleep 0.5; app_specific_keys.sh"
   Control+s

Como nota de rodapé: isso não funcionará, se você desejar alterar as teclas dos programas executados em um terminal (por exemplo, vi ou emacs no modo de console). A classe de aplicativo retornada ainda seria "Gnome-terminal".

Espero que ajude.

xubuntix
fonte
11
Isso acabou funcionando muito bem. Não usei o xdotool para enviar as teclas, apenas usei xvkbd -xsendevent -text "\Cs". Isso não parece sofrer com os problemas que você estava vendo com o xdotool.
Derek Thurn
não é possível fazer uma chamada de chave em si, como fligar xdotool key f. Ainda procurando uma maneira de fazer isso.
phil294
ha, finalmente encontrei um! xdotool type --window $(xdotool getwindowfocus) [keys] usar a opção --window e enviar para a janela ativa no momento NÃO levará a um comportamento recursivo.
phil294
2

autokey é como o AutoHotkey para Ubuntu. Você pode escrever scripts em python e executá-los via atalho de teclado e um filtro do Windows (tornando-o específico para a pseudo-aplicação). Seu script pode controlar eventos de teclado e mouse e até mover janelas como um toque adicional.

aramadia
fonte
autokeyé MUITO mais rápido que xbindkeys, mesmo com o modo de detecção de janela ativado - ação imediata executada. Desvantagem: atribuições dos botões do rato parece não trabalho (eu acho que é um bug)
phil294