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

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 之一与--clearmodifiersxdotool 选项不能很好地配合使用。一种解决方法是在脚本前添加一个 sleep 以便能够自己释放键:在您.xbindkeysrc对此键绑定的更改中:

"sleep 0.5; app_specific_keys.sh"
   Control+s
Run Code Online (Sandbox Code Playgroud)

作为旁注:如果您想更改在终端中运行的程序的密钥(例如控制台模式下的 vi 或 emacs),这将不起作用。返回的应用程序类仍然是“Gnome-terminal”。

希望有帮助。