## Table of contents
{{< toc >}}
## Basic
```
bind=MODS,key,dispatcher,params
```
for example,
```
bind=SUPER_SHIFT,Q,exec,firefox
```
will bind opening firefox to SUPER + SHIFT + Q
{{< hint type=tip >}}
For binding keys without a modkey, leave it empty:
```
bind=,Print,exec,grim
```
{{< /hint >}}
*For a complete mod list, see [The basic configuring page](https://wiki.hyprland.org/Configuring/Basic-Config/#variable-types).*
## Uncommon syms / binding with a keycode
See the
[xkbcommon-keysyms.h header](https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon-keysyms.h)
for all the keysyms. The name you should use is the one after `XKB_KEY_`,
written in all lowercase.
If you are unsure of what your key's name is, or what it shifts into, you can
use `xev` or `wev` to find that information.
If you want to bind by a keycode, you can just input it in the KEY position,
e.g.:
```
bind=SUPER,28,exec,amongus
```
Will bind SUPER + T. (T is keycode 28.) - You
can also use `xev` or `wev` to find keycodes.
## Misc
You can also unbind with `unbind`, e.g.:
```
unbind=SUPER,O
```
May be useful for dynamic keybindings with `hyprctl`.
You can also bind mouse buttons, by prefacing the mouse keycode with `mouse:`,
for example:
```
bind=SUPER,mouse:272,exec,amongus
```
will bind it to SUPER + LMB.
For binding only modkeys, you need to use the TARGET modmask (with the
activating mod) and the `r` flag, e.g.:
```
bindr=SUPERALT,Alt_L,exec,amongus
```
You can also bind the mouse wheel with `mouse_up` and `mouse_down`:
```
bind=SUPER,mouse_down,workspace,e-1
```
(control the reset time with `binds:scroll_event_delay`)
## Bind flags
bind supports flags in this format:
```
bind[flags]=...
```
e.g.:
```
bindrl=MOD,KEY,exec,amongus
```
flags:
```
l -> locked, aka. works also when an input inhibitor is active
r -> release, will trigger on release of a key
e -> repeat, will repeat when held.
m -> mouse, see below
```
## Mouse Binds
Mouse binds are binds that heavily rely on a mouse, usually its movement.
They will have one less arg, and look for example like this:
```
bindm=ALT,mouse:272,movewindow
```
this will create a bind with ALT + LMB to move the window
with your mouse.
*Available mouse binds*:
| name | description |
| -----|------------ |
| movewindow | moves the active window |
| resizewindow | resizes the active window |
*Common mouse buttons' codes:*
```
LMB -> 272
RMB -> 273
```
*for more, you can of course use `wev` to check.*
{{< hint type=tip >}}
Mouse binds, despite their name, behave like normal binds. You are free to use
whatever keys / mods you please. When held, the mouse function will be activated.
{{< /hint >}}
## Binding mods
You can bind a mod alone like this:
```
bindr=ALT,Alt_L,exec,amongus
```
## Global Keybinds
Yes, you heard this right, Hyprland does support global keybinds for ALL apps,
including OBS, Discord, Firefox, etc.
See the `pass` dispatcher for keybinds.
e.g.:
I've set the "Start/Stop Recording" keybind in OBS to SUPER +
F10, and I want it to be global.
Simple, add
```plain
bind = SUPER,F10,pass,^(com\.obsproject\.Studio)$
```
to your config and you're done.
`pass` will pass the PRESS and RELEASE events by itself, no need for a `bindr`.
This also means that push-to-talk will work flawlessly with one pass, e.g.:
```
bind=,mouse:276,pass,^(TeamSpeak 3)$
```
Will pass MOUSE5 to TeamSpeak3.
{{< hint type=important >}}
XWayland is a bit wonky. Make sure that what you're passing is a "global Xorg
keybind", otherwise passing from a different XWayland app may not work.
It works flawlessly with all native Wayland applications though.
*Side note*: **OBS** on Wayland really dislikes keybinds with modifiers. If
they don't work, try removing mods and binding them to e.g. F1.
Combining this with a submap should yield neat and usable results.
{{< /hint >}}
## Submaps
If you want keybind submaps, for example if you press ALT +
R, you can enter a "resize" mode, resize with arrow keys, and leave
with escape, do it like this:
```
bind=ALT,R,submap,resize # will switch to a submap called resize
submap=resize # will start a submap called "resize"
binde=,right,resizeactive,10 0
binde=,left,resizeactive,-10 0
binde=,up,resizeactive,0 -10
binde=,down,resizeactive,0 10
bind=,escape,submap,reset # use reset to go back to the global submap
submap=reset # will reset the submap, meaning end the current one and return to the global one.
# keybinds further down will be global again...
```
**IMPORTANT:** do not forget a keybind to reset the keymap while inside it! (In
this case, `escape`)
If you get stuck inside a keymap, you can use `hyprctl dispatch submap reset` to
go back. If you do not have a terminal open, tough luck buddy. I warned you.