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にアクティブウィンドウを要求し、次にxidに指定されたIDを持つウィンドウのすべてのプロパティを要求し、非常に詳細な出力をアプリケーションの名前(実際にはそのクラス)に減らします。これを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
このshouldは動作しますが、 this question のように、動作しないことを認めざるを得ません。おそらく、Compiz、Unity、Global Menuのいずれかがxdotoolの--clearmodifiers
オプションでうまく機能しないためです。 回避策は、自分でキーをリリースできるように、スクリプトの前にスリープを追加することです:.xbindkeysrc
変更でこのキーバインディングに:
"sleep 0.5; app_specific_keys.sh"
Control+s
補足:端末で実行されるプログラムのキーを変更したい場合、これは機能しません(例:コンソールモードでのviまたはemacs)。返されるアプリケーションクラスは、まだ「Gnome-terminal」です。
お役に立てば幸いです。
autokey はUbuntuのAutoHotkeyのようなものです。 pythonでスクリプトを記述し、キーボードショートカットとWindowsフィルターを使用してそれらを実行させることができます(擬似アプリケーション固有にする)。スクリプトは、キーボードイベントとマウスイベントを制御し、追加のタッチとしてウィンドウを移動することもできます。