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.
218 lines
13 KiB
Markdown
218 lines
13 KiB
Markdown
# 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`](./sway.nix) `config.keybindings` + `config.modes`, plus the home-manager Sway module's built-in defaults |
|
|
| tmux | [`shell.nix`](./shell.nix) `programs.tmux` |
|
|
| zsh line editor | [`shell.nix`](./shell.nix) `programs.zsh.historySubstringSearch` |
|
|
| Neovim | [`editor.nix`](./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`+`1`…`0` | Switch to workspace 1…10 |
|
|
| `Super`+`Shift`+`1`…`0` | 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.
|