Answers:
您使用xbindkeys的想法听起来不错:
在您.xbindkeysrc
添加新的键盘绑定:
"app_specific_keys.sh"
Control+s
这将执行"app_specific_keys.sh"
当你按下ctrl+s
。
现在,您需要定义脚本。它应该获得活动窗口,并从中获得当前具有焦点的应用程序的名称:
xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'
这可以解决问题:它向xdotool询问活动窗口,然后向xprop询问具有给定id的窗口的所有属性,然后将非常冗长的输出简化为应用程序的名称(实际上是其类)。如果您在gnome终端中运行它,您将得到
"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全局菜单之一无法与--clearmodifiers
xdotool选项一起很好地工作。一种解决方法是在脚本前面添加一个睡眠,以便能够自己释放密钥:在.xbindkeysrc
对此键绑定的更改中:
"sleep 0.5; app_specific_keys.sh"
Control+s
附带说明:如果要更改在终端中运行的程序的键(例如,控制台模式下的vi或emacs),则此键无效。返回的应用程序类仍将是“ Gnome-terminal”。
希望能有所帮助。
xvkbd -xsendevent -text "\Cs"
。这似乎并没有因为您使用xdotool遇到的问题而受到影响。
f
call xdotool key f
。仍在寻找一种方法来做到这一点。
xdotool type --window $(xdotool getwindowfocus) [keys]
使用--window选项并发送到当前活动的窗口不会导致递归行为。