Files
nixfiles/home/KEYBINDINGS.md
T
Emma Thorpe 10cc6cceed refactor(flake): add user registry and multi-user host support
Separate user identity (data) from the reusable modules, and let a host
declare any number of users instead of exactly one.

- users/registry.nix: per-user identity (name, email, groups, authorized
  and signing keys) as the single source of identity; no user data is
  hardcoded in the modules.
- mkHost takes a `users` set keyed by username; per-user identity is
  injected into each home config via the `identity` module arg
  (extraSpecialArgs is per-host, so it cannot carry per-user data).
- modules/users.nix builds accounts from the registry; modules/ssh.nix no
  longer defines authorized keys (the registry owns them); home/git.nix
  and home/desktop.nix read `identity`; users/emmathorpe/work.nix drops
  its now-redundant git identity override.
- Restructure the tree: users/, home/, modules/, hosts/, lib/ replace the
  former lyrathorpe/ and system/ layout.
- Add standalone homeConfigurations (the portable subset: shell, git,
  editor, claude) and an exported homeModules output for use on machines
  not managed by this flake, or as an input to other flakes.

Behaviour-preserving for existing hosts: lyrathorpe-mbp and
emmathorpe-edaas evaluate to identical derivations; lyrathorpe-t400,
lyrathorpe-macpro31 and lyrathorpe-rpi5 differ only by de-duplicating a
repeated authorized_keys entry. Fixes the SSH authorized-key leak (one
user's key was applied to every account), the hardcoded default git
identity, and the hardcoded EDaaS linger setting.
2026-06-29 12:27:52 +01:00

13 KiB

Keybindings reference

Every keyboard shortcut configured across this desktop, and where it is defined. Everything here is managed declaratively through Nix — edit the listed file and rebuild, never the generated dotfiles.

Area Defined in
Sway (compositor) sway.nix config.keybindings + config.modes, plus the home-manager Sway module's built-in defaults
tmux shell.nix programs.tmux
zsh line editor shell.nix programs.zsh.historySubstringSearch
Neovim editor.nix programs.nixvim
foot (terminal) foot package defaults — only colours are themed (in sway.nix)

Conventions

  • Super is the Mod4 / logo (Windows/Command) key; Alt is Mod1.
  • Letter keys are keysyms (the character produced), not physical positions. The keyboard is Dvorak (us/dvorak), so e.g. "Super+s" is whatever key types s in Dvorak.
  • Shortcuts apply to every Sway host (MBP, T400, Mac Pro); brightness keys are laptop-only, as noted.

Sway

Applications & session

Shortcut Action
Super+Return Open a terminal (foot)
Super+Space App launcher (sway-launcher-desktop in a floating foot)
Super+d App launcher (same as above; module default)
Super+e File manager (nemo)
Super+c Clipboard history picker (clipman → fuzzel)
Super+l Lock screen (swaylock)
Super+Shift+q Close the focused window
Super+Shift+c Reload the Sway config
Super+Shift+e Exit Sway (asks for confirmation)

Focus

Shortcut Action
Super+/// Move focus by direction
Super+h/j/k Move focus left / down / up (vim-style)
Super+a Focus the parent container
Super+Alt+Space Toggle focus between tiling and floating

Note: vim focus-right would be Super+l, but that is bound to lock here; use Super+.

Moving windows

Shortcut Action
Super+Shift+/// Move the window by direction
Super+Shift+h/j/k/l Move the window left / down / up / right
Super+Shift+Space Toggle the window floating

Mouse (with Super held): left-drag moves a window, right-drag resizes it.

Layout

Shortcut Action
Super+b Split horizontally
Super+v Split vertically
Super+s Stacking layout
Super+w Tabbed layout
Super+f Toggle fullscreen
Super+y Layout submenu: s stacking · w tabbed · e toggle split · Return/Esc exit

The layout submenu's e (toggle split) is the home for that action since Super+e now opens the file manager.

Workspaces

Shortcut Action
Super+10 Switch to workspace 1…10
Super+Shift+10 Move the window to workspace 1…10
Super+z Previous workspace
Super+x Next workspace

Scratchpad

Shortcut Action
Super+Shift+- Move the window to the scratchpad
Super+- Show / cycle the scratchpad

Modes (submenus)

Shortcut Action
Super+r Resize mode: arrow keys resize; Return/Esc exit
Super+y Layout mode (see Layout above)
Super+Shift+x Power menu: l lock · e log out · s sleep · r reboot · Shift+s shutdown · Return/Esc exit

Screenshots

Shortcut Action
Print Select a region → swappy (annotate/save)
Shift+Print Focused window → swappy

Audio & media

Shortcut Action
XF86AudioRaiseVolume / XF86AudioLowerVolume Volume ±5% (wpctl)
XF86AudioMute Toggle output mute
XF86AudioMicMute Toggle microphone mute
XF86AudioPlay Play/pause (playerctl)
XF86AudioNext / XF86AudioPrev Next / previous track

Brightness — laptops only

Shortcut Action
XF86MonBrightnessUp / XF86MonBrightnessDown Backlight ±5% (brightnessctl)

Present only on portable hosts (T400, MBP); desktops have no internal backlight.


tmux

Prefix is Ctrl+b (default). Copy mode uses vi keys.

Shortcut Action
Ctrl+b then v Split into left/right panes
Ctrl+b then s Split into top/bottom panes
Ctrl+h/j/k/l Move between panes — and into/out of vim splits — seamlessly (vim-tmux-navigator, no prefix)
Alt+/// Switch pane by direction (no prefix needed)
Ctrl+b then [ Enter copy mode (then vi motions; Space/Enter to select/copy)
Ctrl+b then z Zoom / unzoom the focused pane
Ctrl+b then c New window
Ctrl+b then n / p Next / previous window
Ctrl+b then d Detach
Ctrl+b then Ctrl+s / Ctrl+r Save / restore the session (resurrect; continuum also auto-saves and restores on start)
Mouse Enabled — click to focus, drag borders, scroll, select

The stock split keys % and " are unbound; use v / s above. Ctrl+b then s is therefore a split, not the session tree.

Sessions persist across reboots (resurrect + continuum). Terminals auto-start tmux; NO_TMUX=1 <terminal> opens a bare shell instead.


foot (terminal)

Only colours are themed; these are foot's default key bindings.

Shortcut Action
Ctrl+Shift+c / Ctrl+Shift+v Copy / paste (clipboard)
Shift+Insert Paste primary selection
Ctrl+Shift+r Search scrollback
Ctrl++ / Ctrl+- / Ctrl+0 Font larger / smaller / reset
Ctrl+Shift+u URL mode (jump to/open links)
Ctrl+Shift+n Spawn a new terminal
Shift+PageUp / Shift+PageDown Scroll back / forward

Neovim

Leader is Space. Ctrl+h/j/k/l is shared with tmux (see above): it moves across vim splits and tmux panes seamlessly. Everything else is stock vim, plus:

Shortcut Action
,``, Toggle the file tree (nvim-tree) — comma pressed twice
Ctrl+h/j/k/l Move between vim splits / tmux panes (vim-tmux-navigator)
<leader>ff Find files (telescope)
<leader>fg Live grep (telescope)
<leader>fb Switch buffer (telescope)
<leader>xx Diagnostics list (trouble)
gc / gcc Toggle comment (selection / line)
gd Go to definition (LSP)
gr List references (LSP)
K Hover documentation (LSP)
<leader>rn Rename symbol (LSP; <leader> is Space)
<leader>ca Code action (LSP)

Completion menu (nvim-cmp)

Active only while the completion popup is open (it appears as you type, e.g. file paths):

Shortcut Action
Tab / Shift+Tab Select next / previous item
Ctrl+n / Ctrl+p Select next / previous item
Ctrl+Space Open the completion menu
Enter Confirm the highlighted item (no auto-select; otherwise a newline)
Ctrl+e Dismiss the menu

LSP covers Nix, Lua, Python and Terraform (the work box adds C# and Helm). Files are formatted on save (conform-nvim). :Git opens fugitive; gitsigns shows gutter signs. which-key pops up after <leader> to show the rest.


zsh

Shortcut Action
/ History substring search — type a fragment first, then the arrows cycle matching past commands

Bound for both CSI and SS3 cursor sequences, so it works in foot, iTerm2 and the Linux TTY alike.