Xbindkeys is a program that allows to bind commands to certain keys or key combinations on the keyboard. Xbindkeys works with multimedia keys and is independent of the window manager and desktop environment.
Install the package.
Create a blank
~/.xbindkeysrc, or you can create a sample file (Note this includes some bindings such as
Ctrl+f, which you may want to edit or remove):
$ xbindkeys -d > ~/.xbindkeysrc
Now you can either edit
~/.xbindkeysrc to set keybindings, or you can do that with the GUI.
xbindkeys -pto reload the configuration file and apply the changes.
Here is an example configuration file that binds Fn key combos on a laptop to pactl commands that adjust sound volume. Note that pound (#) symbols can be used to create comments.
# Increase volume "pactl set-sink-volume 0 +1000" XF86AudioRaiseVolume
# Decrease volume "pactl set-sink-volume 0 -1000" XF86AudioLowerVolume
For graphical configuration install the AUR package and run:
To find the keycodes for a particular key, enter the following command:
$ xbindkeys -k
A blank window will pop up. Press the key(s) to which you wish to assign a command and xbindkeys will output a handy snippet that can be entered into
~/.xbindkeysrc. For example, while the blank window is open, press
Alt+o to get the following output (results may vary):
"(Scheme function)" m:0x8 + c:32 Alt + o
The first line represents a command. The second contains the state (0x8) and keycode (32) as reported by
xev. The third line contains the keysyms associated with the given keycodes. To use this output, copy either one of the last two lines to
~/.xbindkeysrc and replace "(Scheme function)" with the command you wish to perform.
xbindkeys -mkto keep the key prompt open for multiple keypresses. Press
To identify mouse buttons, you can use xev, see here
Making changes permanent
before the line that starts your window manager or DE.
Simulating multimedia keys
The XF86Audio* and other multimedia keys  are pretty-much well-recognized by the major DEs. For keyboards without such keys, you can simulate their effect with other keys
# Decrease volume on pressing Super-minus "pactl set-sink-volume 0 -1000" m:0x50 + c:20 Mod2+Mod4 + minus
However, to actually call the keys themselves you can use tools like official repositories) and AUR (from the AUR). Unfortunately since you'd already be holding down some modifier key (Super or Shift, for example), X will see the result as
Super-XF86AudioLowerVolume which won't do anything useful. Here's a script based on xmacro and xmodmap from the package for doing this.
#!/bin/sh echo 'KeyStrRelease Super_L KeyStrRelease minus'
This works for calling XF86AudioLowerVolume once (assuming you are using
Super+minus), but repeatedly calling it without releasing the Super key (like tapping on a volume button) does not work. If you would like it to work that way, add the following line to the bottom of the script.
echo 'KeyStrPress Super_L' | xmacroplay :0
With this modified script, if you press the key combination fast enough your Super_L key will remain 'on' till the next time you hit it, which may result in some interesting side-effects. Just tap it again to remove that state, or use the original script if you want things to 'just work' and do not mind not multi-tapping on volume up/down.
These instructions are valid for pretty much any one of the XF86 multimedia keys (important ones would be XF86AudioRaiseVolume, XF86AudioLowerVolume, XF86AudioPlay, XF86AudioPrev, XF86AudioNext).
If, for any reason, a hotkey you already set in
~/.xbindkeysrc doesn't work, open up a terminal and type the following:
$ xbindkeys -n
By pressing the non-working key, you will be able to see any error xbindkeys encounter (e.g: mistyped command/keycode,...).
If the command for a keybind works via the xdotool in command line, but not when activated by the hotkey try adding "+ Release" to the hotkey (Esp notable on gnome):
"xdotool key --clearmodifiers XF86AudioPlay" Mod2 + F7 + Release
This will make the F7 key play/pause audio. Where the "xdotool" command would work in commandline, if the "+ Release" is removed it will fail with xbindkeys.