Odwzorowanie kombinacji klawiszy specyficzne dla aplikacji?

18

Zdaję sobie sprawę z wielu sposobów mapowania kombinacji klawiszy w Ubuntu na poziomie globalnym (np. Globalne mapowanie Ctrl + S, aby wysłać Ctrl + D lub coś takiego), takie jak aplikacja xbindkeys . Potrzebuję jednak sposobu, aby to zrobić tylko dla konkretnej aplikacji . Na przykład coś w rodzaju „Remap Ctrl + S, aby wysłać Ctrl + D, ale tylko w Chrome ”. Czy jest jakiś sposób na osiągnięcie tego?

Derek Thurn
źródło
Czy czytałeś ten wątek ? Nie próbowałem tego, ale wydaje mi się, że jest to dokładnie to, czego szukasz. Nie wiem jednak, jak napisać poprawną odpowiedź.
lędźwiowy

Odpowiedzi:

12

Twój pomysł użycia xbindkeys brzmi dobrze:

w Twoim .xbindkeysrc dodaniu nowego skrótu klawiszowego:

"app_specific_keys.sh"
   Control+s

To się wykona "app_specific_keys.sh" po naciśnięciu ctrl+s.

Teraz musisz zdefiniować skrypt. Powinien uzyskać aktywne okno, a następnie nazwę aplikacji, która jest aktualnie aktywna:

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

To by załatwiło sprawę: pyta xdotool o aktywne okno, następnie pyta xprop o wszystkie właściwości okna o podanym identyfikatorze, a następnie redukuje bardzo szczegółowe dane wyjściowe do nazwy aplikacji (właściwie jej klasy). Jeśli uruchomisz to w terminalu gnomów, dostaniesz

"Gnome-terminal"

Teraz musisz zdefiniować działania dla swoich aplikacji:

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

Razem skrypt "app_specific_keys.sh"może wyglądać następująco:

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

To powinno zadziałać, ale podobnie jak w tym pytaniu muszę przyznać, że tak nie jest. Prawdopodobnie dlatego, że jedno z Compiz, Unity, Global Menu nie działa dobrze z --clearmodifiersopcją xdotool. Rozwiązaniem byłoby dodać sen przed skryptu w Odrze, aby móc zwolnić klawisze sobie pytanie: W swojej .xbindkeysrczmiany tego kombinacja klawiszy:

"sleep 0.5; app_specific_keys.sh"
   Control+s

Na marginesie: to nie zadziała, jeśli chcesz zmienić klucze dla programów działających w terminalu (np. Vi lub emacs w trybie konsoli). Zwrócona klasa aplikacji nadal będzie „Gnome-terminal”.

Mam nadzieję, że to pomaga.

xubuntix
źródło
1
To skończyło się dobrze. Nie używałem xdotool do wysyłania naciśnięć klawiszy, po prostu użyłem xvkbd -xsendevent -text "\Cs". Wydaje się, że to nie dotyczy problemów z Xdotool.
Derek Thurn
nie można wykonać samego połączenia kluczowego, takiego jak fpołączenie xdotool key f. Wciąż szukam sposobu, aby to zrobić.
phil294
ha, w końcu znalazłem jeden! xdotool type --window $(xdotool getwindowfocus) [keys] użycie opcji --window i wysłanie do aktualnie aktywnego okna NIE doprowadzi do zachowania rekurencyjnego.
phil294
2

autokey jest jak AutoHotkey dla Ubuntu. Możesz pisać skrypty w pythonie i uruchamiać je za pomocą skrótu klawiaturowego i filtra systemu Windows (co czyni go specyficznym dla pseudo aplikacji). Twój skrypt może kontrolować zdarzenia na klawiaturze i myszy, a nawet przesuwać okna jako dodatkowy dotyk.

aramadia
źródło
autokeyjest DROGA szybszy niż xbindkeys, nawet przy włączonym trybie wykrywania okna - natychmiast podejmowane są działania. Wada: przypisania przycisków myszy wydają się nie działać (myślę, że to błąd)
phil294