Der*_*urn 22 shortcut-keys x11
我知道有多种在 Ubuntu 中全局重新映射组合键的方法(例如,全局重新映射 Ctrl+S 以发送 Ctrl+D 或其他),例如xbindkeys应用程序。不过,我需要的是一种仅针对特定应用程序执行此操作的方法。例如,类似“重新映射 Ctrl+S 以发送 Ctrl+D,但仅在 Chrome 中”之类的内容。有什么办法可以做到这一点吗?
xub*_*tix 14
您使用 xbindkeys 的想法听起来不错:
在您.xbindkeysrc
添加一个新的键绑定:
"app_specific_keys.sh"
Control+s
Run Code Online (Sandbox Code Playgroud)
这将"app_specific_keys.sh"
在您按下时执行ctrl+s
。
现在您需要定义脚本。它应该获取活动窗口,并从中获取当前具有焦点的应用程序的名称:
xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'
Run Code Online (Sandbox Code Playgroud)
这可以解决问题:它向 xdotool 询问活动窗口,然后向 xprop 询问具有给定 id 的窗口的所有属性,然后将非常冗长的输出减少到应用程序的名称(实际上是它的类)。如果你在 gnome-terminal 中运行它,你会得到
"Gnome-terminal"
Run Code Online (Sandbox Code Playgroud)
现在您需要为您的应用程序定义操作:
if [ $N = '"Gnome-terminal"' ]; then
xdotool key --clearmodifiers ctrl+s
else
xdotool key --clearmodifiers ctrl+d
fi
Run Code Online (Sandbox Code Playgroud)
因此,脚本"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
Run Code Online (Sandbox Code Playgroud)
这应该有效,但就像在这个问题中一样,我不得不承认它没有。可能是因为 Compiz、Unity、Global Menu 之一与--clearmodifiers
xdotool 选项不能很好地配合使用。一种解决方法是在脚本前添加一个 sleep 以便能够自己释放键:在您.xbindkeysrc
对此键绑定的更改中:
"sleep 0.5; app_specific_keys.sh"
Control+s
Run Code Online (Sandbox Code Playgroud)
作为旁注:如果您想更改在终端中运行的程序的密钥(例如控制台模式下的 vi 或 emacs),这将不起作用。返回的应用程序类仍然是“Gnome-terminal”。
希望有帮助。
归档时间: |
|
查看次数: |
7990 次 |
最近记录: |