アプリケーション固有のキーの組み合わせの再マッピング?


18

xbindkeysアプリケーションなど、Ubuntuでキーの組み合わせをグローバルに再マッピングする方法(たとえば、Ctrl + Sを送信するためにCtrl + Sをグローバルに再マッピングする方法)を知っています。ただし、特定のアプリケーションに対してのみこれを行う方法が必要です。たとえば、「Ctrl + SをリマップしてCtrl + Dを送信しますが、Chromeでのみ」などです。これを達成する方法はありますか?


このスレッドを読みましたか?試したことはありませんが、あなたが探しているものは間違いなくあるようです。しかし、適切な答えを書くことについてはわからない。
umbric

回答:


12

xbindkeysを使用するというあなたのアイデアはいいですね。

あなた.xbindkeysrcの新しいキーバインディングを追加してください:

"app_specific_keys.sh"
   Control+s

"app_specific_keys.sh"を押すと実行されますctrl+s

次に、スクリプトを定義する必要があります。アクティブなウィンドウを取得し、そこから現在フォーカスがあるアプリの名前を取得する必要があります。

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

これはトリックを行います:アクティブウィンドウをxdotoolに要求し、次に指定されたIDを持つウィンドウのすべてのプロパティをxpropに要求し、非常に詳細な出力をアプリケーションの名前(実際にはそのクラス)に減らします。これをgnome-terminalで実行すると、次のようになります

"Gnome-terminal"

次に、アプリケーションのアクションを定義する必要があります。

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

したがって、スクリプト"app_specific_keys.sh"は次のようになります。

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

これ機能するはずですが、この質問のように、機能しないことを認めざるを得ません。おそらく、Compiz、Unity、Global Menuのいずれかが--clearmodifiersxdotool のオプションでうまく機能しないためです。この問題を回避するには、キーを自分を解放できるようにするオーデルでスクリプトの前に睡眠を追加することです:あなたは.xbindkeysrcこのキーバインドを変更:

"sleep 0.5; app_specific_keys.sh"
   Control+s

補足:端末で実行されるプログラム(コンソールモードでのviまたはemacsなど)のキーを変更する場合、これは機能しません。返されるアプリケーションクラスは、まだ「Gnome-terminal」です。

お役に立てば幸いです。


1
これでうまくいきました。キーストロークを送信するのにxdotoolを使用しませんでしたxvkbd -xsendevent -text "\Cs"。これは、xdotoolで見た問題に苦しんでいないようです。
デレクサーン

それは次のように、キーの呼び出し自体を作ることはできませんf呼び出しますxdotool key f。まだこれを行う方法を探しています。
phil294

ハ、ついに見つけた!xdotool type --window $(xdotool getwindowfocus) [keys] --windowオプションを使用して現在アクティブなウィンドウに送信しても、再帰的な動作にはなりません。
phil294

2

autokeyはUbuntuのAutoHotkeyのようなものです。スクリプトをpythonで記述し、キーボードショートカットとWindowsフィルターを使用して実行させることができます(擬似アプリケーション固有にします)。スクリプトは、キーボードイベントとマウスイベントを制御し、さらにタッチを追加してウィンドウを移動できます。


autokeyxbindkeys、ウィンドウ検出モードがオンの場合でも、よりもはるかに高速です-すぐにアクションが実行されます。欠点:マウスボタンの割り当てが機能しないようです(バグだと思います)
phil294
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.