跳转至内容

xbindkeys

来自 ArchWiki

xbindkeys 是一个允许将命令绑定到键盘上特定按键或按键组合的程序。它支持多媒体键,且独立于窗口管理器和桌面环境。

安装

安装 xbindkeys 软件包。

配置

创建一个空白的 ~/.xbindkeysrc,或者你可以创建一个示例文件

注意 这其中包含一些绑定(例如 Ctrl+f),你可能需要对其进行编辑或删除。
$ xbindkeys -d > ~/.xbindkeysrc

现在你可以编辑 ~/.xbindkeysrc 来设置按键绑定,或者使用 #GUI 方法 来实现。

提示 如果配置文件被修改,xbindkeys 会重新加载。发送 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#Keyboard volume controlALSA#Keyboard volume control

背光控制

背光控制的按键绑定可以使用 XF86MonBrightnessUpXF86MonBrightnessDown 键来定义。可用背光控制实用工具请参阅 Backlight#Backlight utilities

GUI 方法

如需图形化配置,请 安装 xbindkeys_config-gtk2AUR 软件包并运行

$ xbindkeys_config

识别键码

要查找特定按键的键码,请输入以下命令

$ xbindkeys --key

或者输入以下命令以捕获多个按键

$ xbindkeys --multikey

此时会弹出一个空白窗口。按下你希望分配命令的按键,xbindkeys 将输出一段可以直接输入到 ~/.xbindkeysrc 中的便捷代码片段。例如,在空白窗口打开时,按下 Alt+o 会得到以下输出(结果可能有所不同)

"(Scheme function)"
    m:0x8 + c:32
    Alt + o
  1. 第一行代表命令。
  2. 第二行包含 xev 工具报告的状态 (0x8) 和键码 (32)。
  3. 第三行包含与给定键码相关的 keysyms。

要使用此输出,请将最后两行中的任意一行复制到 ~/.xbindkeysrc 中,并将 "(Scheme function)" 替换为你希望执行的命令。

要识别鼠标按钮,可以使用 xev,请参阅 [1]

提示 如果使用了多键模式,请按 q 退出窗口。
注意 xevxorg-xev 软件包提供,详见 xev(1)

使更改永久生效

配置好按键后,编辑你的 xprofilexinitrc 文件(取决于你的窗口管理器)并添加

xbindkeys

将其放在启动窗口管理器或 DE 的那一行之前。

模拟多媒体键

XF86Audio* 和其他多媒体键(见 LQWiki:XF86 keyboard symbols)在主流 DE 中基本都被很好地识别。对于没有这些按键的键盘,你可以用其他按键来模拟其效果

# Decrease volume on pressing Super-minus
"pactl set-sink-volume 0 -1000"
   m:0x50 + c:20
   Mod2+Mod4 + minus

然而,要真正调用这些按键本身,你可以使用 xdotoolxmacroAUR 等工具。不幸的是,由于你此时已经按住了某个修饰键(例如 Super 或 Shift),X 将识别结果为 Super-XF86AudioLowerVolume,这不会产生任何有用的效果。这里有一个基于 xmacroxorg-xmodmap 软件包中 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)。

鼠标组合键 (Mouse chording)

通过将鼠标上的一个按钮指定为“组合 (chording)”键(类似于键盘上的 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 将无法处理这种情况。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.