我知道在 Ubuntu 中有很多方法可以在全局范围内重新映射组合键(例如,全局重新映射 Ctrl+S 以发送 Ctrl+D 等),比如绑定键应用程序。然而,我需要一种方法来做到这一点仅适用于特定应用。例如,“重新映射 Ctrl+S 以发送 Ctrl+D,但仅限 Chrome“。有什么办法可以实现这个吗?
答案1
您使用 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、Global Menu 中的一个不能很好地与--clearmodifiers
xdotool 选项配合使用。解决方法可以在脚本前面添加一个 sleep 以便能够自己释放按键: 在您.xbindkeysrc
对此键绑定的更改中:
"sleep 0.5; app_specific_keys.sh"
Control+s
附注:如果您想更改在终端中运行的程序的键(例如控制台模式下的 vi 或 emacs),这将不起作用。返回的应用程序类仍将是“Gnome-terminal”。
希望有所帮助。
答案2
自动键就像 Ubuntu 的 AutoHotkey。您可以用 Python 编写脚本,并通过键盘快捷键和 Windows 过滤器执行它们(使其成为特定于伪应用程序的)。您的脚本可以控制键盘和鼠标事件,甚至可以移动窗口作为附加功能。