Skip to content

Shortcuts

The [shortcuts] section binds the shell’s global keyboard shortcuts. These are registered with the compositor (Mir’s ext-input-trigger protocols), so they fire no matter which window has focus.

[shortcuts]
open_settings = "super+s"
open_launcher = "super+d"
open_emoji = "ctrl+shift+e"
open_notifications = "super+n"
open_power_menu = "shift+super+e"
switch_windows = "alt+tab"
switch_windows_back = "alt+shift+tab"
screenshot_area = "print"
record_screen = "super+print"
toggle_scratchpad = "super+z"
move_to_scratchpad = "shift+super+z"
power_button = "poweroff"
Key Type Default Description
open_settings string "super+s" Opens (and closes) the settings overlay
open_launcher string "super+d" Opens (and closes) the application launcher
open_emoji string "ctrl+shift+e" Opens (and closes) the emoji picker
open_notifications string "super+n" Opens (and closes) the notification panel
open_power_menu string "shift+super+e" Opens (and closes) the power menu — shut down, restart, suspend, lock or log out
switch_windows string "alt+tab" Opens the window switcher and moves forward through it
switch_windows_back string "alt+shift+tab" The same switcher, moving backwards
screenshot_area string "print" Drag out an area and screenshot it — the screenshot module’s own Select an area
record_screen string "super+print" Starts recording the screen you are on; press it again to stop
toggle_scratchpad string "super+z" Shows what is on the window manager’s scratchpad, or hides it — the scratchpad module’s own click
move_to_scratchpad string "shift+super+z" Moves the focused window to the scratchpad
power_button string "poweroff" The machine’s own power button — what it does is [power]

record_screen records the whole of the output holding the focused workspace, and needs no aim: nothing is put on screen first, so the recording opens on the desktop as it already is. On a shell that is not connected to the window manager — and so cannot tell which screen that is — it falls back to asking you to click the screen to record, which is what the recorder module’s own Select a screen does.

switch_windows is the only shortcut here that is held rather than pressed. The first press puts an overlay on every screen showing an icon for each open window, five to a row; each further press of Tab moves the highlight, and letting go of Alt switches to whatever it is on. The full title of the highlighted window is written under the grid, which is what tells two windows of the same application apart. Escape, or a click on the backdrop, closes it without switching; a click on an icon switches to that window.

The list is ordered most-recently-used first, so the very first press lands on the window you were in before this one — tap and release to go back and forth between two windows. That ordering comes from the window manager, so a shell that is not connected to it offers the compositor’s own order instead; everything else works the same.

Rebinding is the usual thing with one constraint: keep a modifier in it. What ends the gesture is the modifier coming back up, so a binding with none — switch_windows = "f13" — would leave the switcher on screen with nothing to release. Both keys are read independently, so you can bind them to different modifiers, or set either to "" to turn that direction off.

If the window that is picked is on another workspace, the shell switches to that workspace first and focuses the window second. Both go to the window manager as one request, so nothing can land in between.

Changing these requires restarting the shell. Shortcuts are registered once at start-up; unlike the theme or panel layout they do not reload live.

The keyboard icon on the bar opens the shortcut sheet, and every one of the above is listed on it under Shell, alongside every binding the window manager has configured. Click one and press the combination you want:

  • Esc stops listening and changes nothing;
  • Backspace clears the shortcut, the same as writing "" below;
  • the arrow beside a row you have changed puts it back on its default.

Only the shell’s own shortcuts can be changed from there. The window manager’s bindings are on the same sheet but read-only — they are miracle’s configuration, and they are edited under Settings › Window Manager › Key Bindings.

What you press is written back into config.toml as the text you would have typed yourself, so the file stays readable and hand-editable. Two things the sheet says that the file cannot: it refuses a combination another of the shell’s own shortcuts is already on (the second registration would silently never happen), and it warns — without refusing — when the window manager already uses that combination for something. And because registration latches at start-up, an edited row says so until the shell is restarted.

A shortcut is modifiers and a key joined by +, in any case:

Part Accepted spellings
Modifiers ctrl / control, shift, alt, super / meta / win / logo
Key a letter a–z, a digit 0–9, f1–f24, or a named key

Named keys: space, return / enter, tab, escape / esc, backspace, delete / del, insert, home, end, pageup, pagedown, left, right, up, down, print, pause, menu, poweroff / power, sleep, and the punctuation names minus, equal, plus, comma, period, slash, backslash, semicolon, apostrophe, grave, bracketleft, bracketright.

Left/right modifier variants are deliberately not offered: a trigger fires only when exactly the registered modifiers are held, so binding the left Control key would stop the shortcut working on the right one.

Shift must be written out. "ctrl+S" means Ctrl and the S key — it is read identically to "ctrl+s". Write "ctrl+shift+s" if you want Shift in the combination.

The compositor matches on the character your layout actually produces, so a shortcut containing shift is resolved before it is registered: "ctrl+shift+s" registers S, and "ctrl+shift+1" registers !. That resolution uses a US layout table. On other layouts, shifted digits and punctuation will be wrong — letters are fine everywhere.

Two escape hatches cover the rest:

[shortcuts]
open_settings = "ctrl+0x1b" # a raw xkbcommon keysym
open_settings = "ctrl+code:31" # a raw evdev keycode — layout-independent

The code: form binds the physical key, so it keeps working when you switch layouts.

Set it to an empty string (or "none") to register nothing — useful when a combination collides with an input method such as fcitx or IBus:

[shortcuts]
open_settings = ""

An unparseable value is not treated as “disabled”: it falls back to the default and logs why, so a typo does not silently cost you a shortcut.

If another client already owns a combination, the shell logs it and moves on — it never fails to start over a shortcut.