# Canonical keybind list — the single source of truth for BOTH the # Hyprland `bind` strings (hyprland.nix) and the SUPER+? cheatsheet # rendered by nomarchy-menu (rofi.nix). One place, no second renderer to # keep in sync — the same rule the theme pipeline follows. # # mods — modifier string, Hyprland syntax ("$mod", "$mod SHIFT", "") # key — the key name # action — the Hyprland dispatcher (+args) that the bind runs # desc — human label, shown in the cheatsheet # # `extra` holds cheatsheet-only rows for binds generated elsewhere # (per-workspace numbers, mouse drags) so they still show up under SUPER+?. { binds = [ { mods = "$mod"; key = "Return"; action = "exec, $terminal"; desc = "Open terminal"; } { mods = "$mod"; key = "Space"; action = "exec, rofi -show drun"; desc = "Quick launch (apps)"; } { mods = "$mod"; key = "D"; action = "exec, rofi -show drun"; desc = "App launcher"; } { mods = "$mod"; key = "M"; action = "exec, nomarchy-menu"; desc = "Main menu"; } { mods = "$mod"; key = "E"; action = "exec, $terminal -e yazi"; desc = "File manager (yazi)"; } { mods = "$mod"; key = "Q"; action = "killactive"; desc = "Close window"; } { mods = "$mod"; key = "F"; action = "fullscreen"; desc = "Fullscreen"; } { mods = "$mod"; key = "V"; action = "togglefloating"; desc = "Toggle floating"; } { mods = "$mod SHIFT"; key = "E"; action = "exit"; desc = "Exit Hyprland"; } # Theme picker (menu dispatcher): apply writes the state and runs # home-manager switch (progress via notify-send). { mods = "$mod"; key = "T"; action = "exec, nomarchy-menu theme"; desc = "Theme picker"; } # Cycle the current theme's wallpapers (instant, no rebuild). { mods = "$mod SHIFT"; key = "T"; action = "exec, nomarchy-theme-sync bg next"; desc = "Next wallpaper"; } # Power menu via the dispatcher. Not Escape: Super+Escape gets # swallowed before reaching the dispatcher on some setups. { mods = "$mod"; key = "X"; action = "exec, nomarchy-menu power"; desc = "Power menu"; } { mods = "$mod"; key = "N"; action = "exec, swaync-client -t"; desc = "Notification centre"; } # SUPER+? — ? is typed as Shift+/, so SHIFT must be in the bind's # modmask or Hyprland's exact-modifier match never fires (the key then # falls through to the focused window; caught on hardware, item 26). # The cheatsheet still renders this row as SUPER + ? (rofi.nix). { mods = "$mod SHIFT"; key = "question"; action = "exec, nomarchy-menu keybinds"; desc = "Keybindings cheatsheet"; } # Menu functions — SUPER+CTRL+ jumps straight to a # nomarchy-menu module (all also reachable from the SUPER+M picker). { mods = "$mod CTRL"; key = "V"; action = "exec, nomarchy-menu clipboard"; desc = "Clipboard history"; } { mods = "$mod CTRL"; key = "C"; action = "exec, nomarchy-menu calc"; desc = "Calculator"; } { mods = "$mod CTRL"; key = "W"; action = "exec, nomarchy-menu web"; desc = "Web search"; } { mods = "$mod CTRL"; key = "F"; action = "exec, nomarchy-menu files"; desc = "File search"; } { mods = "$mod CTRL"; key = "E"; action = "exec, nomarchy-menu emoji"; desc = "Emoji picker"; } { mods = "$mod CTRL"; key = "N"; action = "exec, nomarchy-menu network"; desc = "Network (nmtui)"; } { mods = "$mod CTRL"; key = "B"; action = "exec, nomarchy-menu bluetooth"; desc = "Bluetooth"; } { mods = "$mod CTRL"; key = "S"; action = "exec, nomarchy-menu capture"; desc = "Screenshot / capture"; } { mods = "$mod CTRL"; key = "A"; action = "exec, nomarchy-menu ask"; desc = "Ask Claude"; } { mods = "$mod CTRL"; key = "D"; action = "exec, nomarchy-menu dnd"; desc = "Do Not Disturb toggle"; } # Focus { mods = "$mod"; key = "H"; action = "movefocus, l"; desc = "Focus left"; } { mods = "$mod"; key = "L"; action = "movefocus, r"; desc = "Focus right"; } { mods = "$mod"; key = "K"; action = "movefocus, u"; desc = "Focus up"; } { mods = "$mod"; key = "J"; action = "movefocus, d"; desc = "Focus down"; } # Screenshot region to clipboard (the menu's Capture module has more). { mods = ""; key = "Print"; action = "exec, grim -g \"$(slurp)\" - | wl-copy"; desc = "Screenshot region → clipboard"; } ]; # Rendered only when the session has >1 layout (a comma in # nomarchy.keyboard.layout) — hyprland.nix and rofi.nix both gate on # that same condition, so the bind and its cheatsheet row stay in # step. `current` targets the focused keyboard, so a board with its # own per-device layout (a single one) is a no-op, never a leak. multiLayoutBinds = [ { mods = "$mod SHIFT"; key = "K"; action = "exec, hyprctl switchxkblayout current next"; desc = "Cycle keyboard layout"; } ]; extra = [ { keys = "SUPER + 1-9"; desc = "Switch to workspace 1-9"; } { keys = "SUPER + SHIFT + 1-9"; desc = "Move window to workspace 1-9"; } { keys = "SUPER + drag"; desc = "Move (LMB) / resize (RMB) window"; } { keys = "Volume / Brightness"; desc = "Hardware keys, shown via the OSD"; } { keys = "Bar: 󰾪 click"; desc = "Caffeine — hold the screen awake (idle inhibitor)"; } ]; }