# 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.
