Uygulamaya özel tuş kombinasyonu yeniden eşleme?


18

Ubuntu'daki tuş kombinasyonlarını xbindkeys uygulaması gibi global olarak (örneğin, Ctrl + S veya Ctrl + D veya başka bir şey göndermek için küresel olarak yeniden eşleme) yeniden eşlemenin çeşitli yollarının farkındayım . Gereksinim duyduğum şey, bunu yalnızca belirli bir uygulama için yapmanın bir yoludur . Örneğin, "Ctrl + D'yi yalnızca Chrome'da göndermek için Ctrl + S’yi yeniden eşle" gibi bir şey . Bunu başarmanın bir yolu var mı?


Bu konuyu okudun mu? Ben denemedim, ama bana öyle geliyor ki, tam olarak aradığın şey gibi görünüyor. Yine de doğru bir cevap yazacağını bilmiyorum.
lumbric

Yanıtlar:


12

Xbindkeys kullanma fikriniz kulağa hoş geliyor:

Gözlerinde farklı .xbindkeysrcbir yeni keybinding ekleyin:

"app_specific_keys.sh"
   Control+s

Bu, "app_specific_keys.sh"tuşuna bastığınızda yürütülür ctrl+s.

Şimdi betiği tanımlamanız gerekiyor. Etkin pencereyi ve şu anda odağı olan uygulamanın adını almalıdır:

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

Bu hile yapar: aktif pencere için xdotool ister, sonra verilen kimliğe sahip pencerenin tüm özellikleri için xprop ister ve sonra çok ayrıntılı çıktıyı uygulamanın adına (aslında kendi sınıfına) indirir. Eğer bunu bir gnome terminalinde çalıştırırsanız,

"Gnome-terminal"

Şimdi uygulamalarınız için eylemler tanımlamanız gerekir:

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

Yani birlikte, senaryo "app_specific_keys.sh"şöyle görünebilir:

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

Bu gerektiğini çalışır, ancak olduğu gibi bu soruya ben değil mi itiraf etmeliyim. Muhtemelen Compiz, Unity, Global Menu'den biri --clearmodifiersxdotool seçeneğiyle iyi çalışmadığından. Geçici bir çözüm , anahtarları kendiniz serbest bırakabilmeniz için komut dosyanızın önüne bir uyku eklemek olacaktır .xbindkeysrc:

"sleep 0.5; app_specific_keys.sh"
   Control+s

Bir sidenote olarak: bir terminalde çalışan programlar için tuşları değiştirmek istiyorsanız (örn. Vi veya konsol kipinde emacs) bu çalışmaz. Döndürülen uygulama sınıfı yine de "Gnome-terminal" olacaktır.

Umarım yardımcı olur.


1
Bu iyi çalışıyor sona erdi. Tuş vuruşlarını göndermek için xdotool kullanmadım, yeni kullandım xvkbd -xsendevent -text "\Cs". Bu, xdotool ile gördüğünüz sorunlardan muzdarip görünmüyor.
Derek Thurn

sanki o anahtar çağrıyı kendisi yapmak mümkün değildir fçağırarak xdotool key f. Hala bunu yapmanın bir yolunu arıyorum.
phil294

ha, sonunda bir tane buldum! xdotool type --window $(xdotool getwindowfocus) [keys] --window seçeneğinin kullanılması ve o anda etkin olan pencereye gönderilmesi özyinelemeli davranışa neden OLMAZ.
phil294

2

autokey , Ubuntu için AutoHotkey gibidir. Python'da komut dosyaları yazabilir ve klavye kısayolu ve bir pencere filtresi (sözde uygulamaya özgü) yoluyla yürütülmesini sağlayabilirsiniz. Betiğiniz klavye ve fare olaylarını kontrol edebilir ve hatta pencereleri ek bir dokunuş olarak hareket ettirebilir.


autokeyxbindkeyspencere algılama modu açık olsa bile WAY'dan daha hızlıdır - anında eylem gerçekleştirilir. Dezavantajı: Fare düğmesi atamaları çalışmıyor gibi görünüyor (bir hata olduğunu düşünüyorum)
phil294
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.