xbindkeysアプリケーションなど、Ubuntuでキーの組み合わせをグローバルに再マッピングする方法(たとえば、Ctrl + Sを送信するためにCtrl + Sをグローバルに再マッピングする方法)を知っています。ただし、特定のアプリケーションに対してのみこれを行う方法が必要です。たとえば、「Ctrl + SをリマップしてCtrl + Dを送信しますが、Chromeでのみ」などです。これを達成する方法はありますか?
xbindkeysアプリケーションなど、Ubuntuでキーの組み合わせをグローバルに再マッピングする方法(たとえば、Ctrl + Sを送信するためにCtrl + Sをグローバルに再マッピングする方法)を知っています。ただし、特定のアプリケーションに対してのみこれを行う方法が必要です。たとえば、「Ctrl + SをリマップしてCtrl + Dを送信しますが、Chromeでのみ」などです。これを達成する方法はありますか?
回答:
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のいずれかが--clearmodifiers
xdotool のオプションでうまく機能しないためです。この問題を回避するには、キーを自分を解放できるようにするオーデルでスクリプトの前に睡眠を追加することです:あなたは.xbindkeysrc
このキーバインドを変更:
"sleep 0.5; app_specific_keys.sh"
Control+s
補足:端末で実行されるプログラム(コンソールモードでのviまたはemacsなど)のキーを変更する場合、これは機能しません。返されるアプリケーションクラスは、まだ「Gnome-terminal」です。
お役に立てば幸いです。
xvkbd -xsendevent -text "\Cs"
。これは、xdotoolで見た問題に苦しんでいないようです。
f
呼び出しますxdotool key f
。まだこれを行う方法を探しています。
xdotool type --window $(xdotool getwindowfocus) [keys]
--windowオプションを使用して現在アクティブなウィンドウに送信しても、再帰的な動作にはなりません。