特定于应用程序的组合键是否重新映射?


18

我知道有很多方法可以在全局范围内重新映射Ubuntu中的组合键(例如,全局重新映射Ctrl + S以发送Ctrl + D之类的东西),例如xbindkeys应用程序。不过,我需要的是仅针对特定应用程序执行此操作的方法。例如,类似“重新映射Ctrl + S以发送Ctrl + D,但仅在Chrome中 ”。有什么办法可以做到这一点?


你读过这个话题吗?我没有尝试过,但是在我看来,这显然是您要搜索的内容。不过,我不知道该怎么写正确的答案。
lumbric

Answers:


12

您使用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全局菜单之一无法与--clearmodifiersxdotool选项一起很好地工作。一种解决方法是在脚本前面添加一个睡眠,以便能够自己释放密钥:在.xbindkeysrc对此键绑定的更改中:

"sleep 0.5; app_specific_keys.sh"
   Control+s

附带说明:如果要更改在终端中运行的程序的键(例如,控制台模式下的vi或emacs),则此键无效。返回的应用程序类仍将是“ Gnome-terminal”。

希望能有所帮助。


1
最终效果很好。我没有使用xdotool发送按键,只是使用了xvkbd -xsendevent -text "\Cs"。这似乎并没有因为您使用xdotool遇到的问题而受到影响。
德里克·图恩

本身无法进行按键呼叫,例如fcall xdotool key f。仍在寻找一种方法来做到这一点。
phil294

哈,终于找到了!xdotool type --window $(xdotool getwindowfocus) [keys] 使用--window选项并发送到当前活动的窗口不会导致递归行为。
phil294

2

autokey就像Ubuntu的AutoHotkey一样。您可以使用python编写脚本,并通过键盘快捷键和Windows过滤器(使其成为伪应用程序专用)执行脚本。您的脚本可以控制键盘和鼠标事件,甚至可以增加触摸来移动窗口。


autokeyxbindkeys即使启用了窗口检测模式,它的速度也比快-立即采取了措施。缺点:鼠标按钮分配似乎不起作用(我认为这是一个错误)
phil294
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.