xbindkeys
xbindkeys 是一个允许将命令绑定到键盘上特定按键或按键组合的程序。它适用于多媒体键,并且独立于窗口管理器和桌面环境。
安装
配置
创建一个空白的 ~/.xbindkeysrc
,或者您可以创建一个示例文件
Ctrl+f
,您可能想要编辑或删除它们。$ xbindkeys -d > ~/.xbindkeysrc
现在您可以编辑 ~/.xbindkeysrc
来设置按键绑定,或者您可以使用 #图形界面方法。
HUP
信号以强制重新加载:killall -HUP xbindkeys
。当 HUP
信号被发送到 xbindkeys 时,更改仅在移动鼠标后生效,请参阅 xbindkeys(1) 以获取更多信息。音频控制
这是一个示例配置文件,它将笔记本电脑上的 Fn
键组合绑定到 pactl 命令,这些命令调整音频,例如音量和静音状态。请注意,井号 (#) 符号可以用于创建注释。
~/.xbindkeysrc
# Increase volume "pactl set-sink-volume @DEFAULT_SINK@ +1000" XF86AudioRaiseVolume # Decrease volume "pactl set-sink-volume @DEFAULT_SINK@ -1000" XF86AudioLowerVolume # Mute volume "pactl set-sink-mute @DEFAULT_SINK@ toggle" XF86AudioMute # Mute microphone "pactl set-source-mute @DEFAULT_SOURCE@ toggle" XF86AudioMicMute
有关控制音量的替代命令,请参阅 PulseAudio#键盘音量控制 或 ALSA#键盘音量控制。
背光控制
可以使用 XF86MonBrightnessUp
和 XF86MonBrightnessDown
键定义背光控制的按键绑定。请参阅 Backlight#背光工具 以获取可用的背光控制实用程序。
图形界面方法
对于图形配置,安装 xbindkeys_config-gtk2AUR 软件包并运行
$ xbindkeys_config
识别键码
要查找特定按键的键码,请输入以下命令
$ xbindkeys --key
或以下命令来抓取多个按键
$ xbindkeys --multikey
将弹出一个空白窗口。按下您想要分配命令的按键,xbindkeys 将输出一个方便的代码片段,可以将其输入到 ~/.xbindkeysrc
中。例如,当空白窗口打开时,按下 Alt+o
以获得以下输出(结果可能有所不同)
"(Scheme function)" m:0x8 + c:32 Alt + o
- 第一行表示一个命令。
- 第二行包含工具 xev 报告的状态 (0x8) 和键码 (32)。
- 第三行包含与给定键码关联的键符。
要使用此输出,请将最后两行中的任意一行复制到 ~/.xbindkeysrc
,并将 “(Scheme function)” 替换为您想要执行的命令。
要识别鼠标按钮,可以使用 xev,请参阅 [1]。
q
退出窗口。使更改永久生效
完成按键配置后,编辑您的 xprofile 或 xinitrc 文件(取决于您的窗口管理器),并将
xbindkeys
放在启动窗口管理器或 DE 的行之前。
模拟多媒体键
XF86Audio* 和其他多媒体键(请参阅 LQWiki:XF86 键盘符号)几乎被主要的 DE 广泛认可。对于没有此类按键的键盘,您可以使用其他按键模拟它们的效果
# Decrease volume on pressing Super-minus "pactl set-sink-volume 0 -1000" m:0x50 + c:20 Mod2+Mod4 + minus
然而,要实际调用这些按键本身,您可以使用 xdotool 和 xmacroAUR 等工具。不幸的是,由于您已经按住了一些修饰键(例如 Super 或 Shift),X 会将结果视为 Super-XF86AudioLowerVolume
,这将不会执行任何有用的操作。这是一个基于 xmacro 和 xmodmap 的脚本,来自 xorg-xmodmap 软件包,用于执行此操作[2]。
#!/bin/sh echo 'KeyStrRelease Super_L KeyStrRelease minus' | xmacroplay :0 xmodmap -e 'remove Mod4 = Super_L' echo 'KeyStrPress XF86AudioLowerVolume KeyStrRelease XF86AudioLowerVolume' | xmacroplay :0 xmodmap -e 'add Mod4 = Super_L'
这适用于调用 XF86AudioLowerVolume
一次(假设您正在使用 Super+minus
),但是重复调用它而不释放 Super
键(例如点击音量按钮)不起作用。如果您希望它以这种方式工作,请将以下行添加到脚本的底部。
echo 'KeyStrPress Super_L' | xmacroplay :0
使用这个修改后的脚本,如果您足够快地按下按键组合,您的 Super_L
键将保持“开启”状态,直到您下次按下它,这可能会导致一些有趣的副作用。再次点击它以移除该状态,或者如果您希望一切“正常工作”并且不介意不进行多次点击音量增大/减小,请使用原始脚本。
这些说明几乎对任何一个 XF86 多媒体键都有效(重要的键包括 XF86AudioRaiseVolume
、XF86AudioLowerVolume
、XF86AudioPlay
、XF86AudioPrev
、XF86AudioNext
)。
鼠标组合键
通过将鼠标上的一个按钮专门用作“组合”键(很像键盘上的 Shift
键),可以使用 xbindkeys 来配置您的鼠标以执行比其他方式更多的操作。这需要使用 Scheme 而不是简化的 xbindkeys 语法。
.xbindkeysrc.scm
(define (define-mouse-chords chord-key . definitions) (define (start-mouse-chord) (let ((cmd #f)) (for-each (lambda (definition) (let ((key (list-ref definition 0)) (binding (list-ref definition 1))) (xbindkey-function key (lambda () (set! cmd binding))))) definitions) (xbindkey-function `(release ,chord-key) (lambda () (remove-xbindkey `(release ,chord-key)) (for-each (lambda (definition) (let ((key (list-ref definition 0))) (remove-xbindkey key))) definitions) (if cmd (begin (run-command cmd) (set! cmd #f)) ))))) (xbindkey-function chord-key start-mouse-chord))
定义此函数后,您现在可以配置一些组合命令
(define-mouse-chords "b:10" (list '(release "b:1") "xdotool click 8") (list '(release "b:2") "xdotool click 9") )
这将“按钮 10”定义为鼠标上的组合键。当按下按钮 10 时,该函数将为块内定义的按钮创建绑定。当释放按钮 10 时,这些绑定将被移除。因此,例如:在按住按钮 10 的情况下,按下并释放按钮 1,然后释放按钮 10,将导致生成虚拟的“按钮 8”(后退)事件。
故障排除
如果由于任何原因,您在 ~/.xbindkeysrc
中已经设置的热键不起作用,请打开终端并键入以下内容
$ xbindkeys -n
通过按下不起作用的按键,您将能够看到 xbindkeys 遇到的任何错误(例如:拼写错误的命令/键码,...)。
如果按键绑定的命令通过命令行中的 xdotool 工作,但在通过热键激活时不起作用,请尝试在热键中添加 “+ Release”(在 GNOME 上尤其明显)
"xdotool key --clearmodifiers XF86AudioPlay" Mod2 + F7 + Release
这将使 F7
键播放/暂停音频。如果删除 “+ Release”,即使 “xdotool” 命令在命令行中有效,也会在使用 xbindkeys 时失败。
setxkbmap -layout ch,dk
设置两个或多个键盘布局会导致不同布局的按钮状态不同,xbindkeys 将无法处理这种情况。