Rimappatura della combinazione di tasti specifica dell'applicazione?


18

Sono a conoscenza di una serie di modi per rimappare le combinazioni di tasti in Ubuntu su base globale (ad esempio rimappando globalmente Ctrl + S per inviare Ctrl + D o qualcosa del genere), come l' applicazione xbindkeys . Ciò di cui ho bisogno, tuttavia, è un modo per farlo solo per un'applicazione specifica . Ad esempio, qualcosa come "Rimappa Ctrl + S per inviare Ctrl + D, ma solo in Chrome ". C'è un modo per raggiungere questo obiettivo?


Hai letto questa discussione ? Non l'ho provato, ma mi sembra esageratamente quello che stai cercando. Tuttavia, non so su questo di scrivere una risposta adeguata.
lumbric

Risposte:


12

La tua idea di usare xbindkeys suona bene:

nel tuo .xbindkeysrcaggiungi un nuovo keybinding:

"app_specific_keys.sh"
   Control+s

Questo verrà eseguito "app_specific_keys.sh"quando si preme ctrl+s.

Ora devi definire lo script. Dovrebbe ottenere la finestra attiva e da ciò il nome dell'app che attualmente ha lo stato attivo:

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

Questo farebbe il trucco: chiede a xdotool la finestra attiva, quindi chiede a xprop tutte le proprietà della finestra con l'id specificato, quindi riduce l'output molto dettagliato al nome dell'applicazione (in realtà la sua classe). Se lo esegui in un terminale gnomo, otterrai

"Gnome-terminal"

Ora devi definire le azioni per le tue applicazioni:

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

Quindi insieme, la sceneggiatura "app_specific_keys.sh"potrebbe apparire così:

#!/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  

Questo dovrebbe funzionare, ma come in questa domanda , devo ammettere che non lo fa. Probabilmente perché uno di Compiz, Unity, Global Menu non funziona bene con l' --clearmodifiersopzione di xdotool. Una soluzione alternativa sarebbe quella di aggiungere uno sleep davanti allo script in modo da poter rilasciare le chiavi tu stesso: Nella tua .xbindkeysrcmodifica a questo keybinding:

"sleep 0.5; app_specific_keys.sh"
   Control+s

Come sidenote: questo non funzionerà, se si desidera cambiare le chiavi per i programmi che girano in un terminale (es. Vi o emacs in modalità console). La classe di applicazione restituita sarebbe comunque "Gnome-terminal".

Spero possa aiutare.


1
Questo ha finito per funzionare bene. Non ho usato xdotool per inviare i tasti, ho solo usato xvkbd -xsendevent -text "\Cs". Questo non sembra soffrire dei problemi che stavi riscontrando con xdotool.
Derek Thurn,

non è possibile effettuare una chiamata chiave, come fchiamare xdotool key f. Sto ancora cercando un modo per farlo.
phil294,

ah, finalmente trovato uno! xdotool type --window $(xdotool getwindowfocus) [keys] l'uso dell'opzione --window e l'invio alla finestra attualmente attiva NON comportano comportamenti ricorsivi.
phil294

2

autokey è come AutoHotkey per Ubuntu. Puoi scrivere script in Python e farli eseguire tramite la scorciatoia da tastiera e un filtro di Windows (rendendolo specifico per pseudo-applicazione). Lo script può controllare gli eventi della tastiera e del mouse e persino spostare le finestre come un tocco in più.


autokeyè VELOCEMENTE più veloce di xbindkeys, anche con la modalità di rilevamento della finestra attiva - azioni immediate intraprese. Unico inconveniente: l'assegnazione dei pulsanti del mouse sembra non funzionare (penso che sia un bug)
phil294
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.