xbindkeys
xbindkeys 是一个允许将命令绑定到键盘上特定按键或按键组合的程序。它适用于多媒体键,并且独立于窗口管理器和桌面环境。
安装
安装 xbindkeys 包。
配置
创建一个空的 ~/.xbindkeysrc 文件,或者你可以创建一个示例文件
Ctrl+f,你可能需要编辑或删除它们。$ xbindkeys -d > ~/.xbindkeysrc
现在你可以编辑 ~/.xbindkeysrc 来设置按键绑定,或者使用 #GUI 方法 来完成。
HUP 信号来强制重新加载: killall -HUP xbindkeys。当向 xbindkeys 发送 HUP 信号时,更改仅在移动鼠标后生效,有关更多信息,请参阅 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#背光工具。
GUI 方法
要进行图形化配置,请 安装 xbindkeys_config-gtk2AUR 包并运行
$ xbindkeys_config
识别键码
要查找特定按键的键码,请输入以下命令
$ xbindkeys --key
或者使用以下命令来捕获多个按键
$ xbindkeys --multikey
会弹出一个空白窗口。按下你希望为其分配命令的按键,xbindkeys 将输出一个方便的代码段,可以将其输入到 ~/.xbindkeysrc 中。例如,在空白窗口打开时,按下 Alt+o 将会得到以下输出(结果可能会有所不同)
"(Scheme function)"
m:0x8 + c:32
Alt + o
- 第一行代表一个命令。
- 第二行包含由 xev 工具报告的状态(0x8)和键码(32)。
- 第三行包含与给定键码关联的 keysyms。
要使用此输出,请将最后两行中的任意一行复制到 ~/.xbindkeysrc 中,并将“(Scheme function)”替换为你希望执行的命令。
要识别鼠标按钮,可以使用 xev,请参阅 [1]。
q 键退出窗口。使更改永久生效
完成按键配置后,编辑你的 xprofile 或 xinitrc 文件(取决于你的窗口管理器),并在启动你的窗口管理器或 DE 的行之前添加
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 键播放/暂停音频。虽然“xdotool”命令在命令行中有效,但如果移除“+ Release”,它在 xbindkeys 中会失败。
setxkbmap -layout ch,dk)会导致不同布局下按键状态不同,xbindkeys 将无法处理这种情况。