# Zsh Cheatsheet
Reference for the new ZDOTDIR-based zsh setup (oh-my-zsh removed,
config lives in `~/.config/zsh/`).
## Aliases
### Docker Compose
| Alias | Expands to | What it does |
|---|---|---|
| `dcu` | `docker compose up -d` | Start containers in detached mode |
| `dcd` | `docker compose down` | Stop and remove containers |
| `dcr` | `docker compose restart` | Restart containers |
| `dcp` | `docker compose pull` | Pull latest images |
### Navigation
| Alias | Expands to | What it does |
|---|---|---|
| `..` | `cd ..` | Up one directory |
| `...` | `cd ../..` | Up two directories |
| `....` | `cd ../../..` | Up three directories |
### File listing
| Alias | Expands to | What it does |
|---|---|---|
| `ls` | `eza -lahF --group-directories-first --time-style="+%d/%m/%Y %H:%M" --git` (falls back to plain `ls -lahF ...` if eza isn't installed) | Long listing, all files, classify symbols (`/`, `*`, `@`), directories first, custom date format, git status column |
| `tree` | `eza --tree` (only if eza is installed) | Tree view of directory structure |
| `cat` | `bat` (only if bat is installed) | Syntax-highlighted file viewer |
### System
| Alias | Expands to | What it does |
|---|---|---|
| `df` | `df -h` | Disk usage, human-readable sizes |
| `free` | `free -h` | Memory usage, human-readable sizes |
| `c` | `clear` | Clear the terminal |
## Functions
| Function | Usage | What it does |
|---|---|---|
| `cd` (overridden) | `cd
` | Changes directory, then automatically runs `ls` (so you always see the contents of where you land). `cd` with no argument goes to `$HOME`. |
| `mkcd` | `mkcd ` | Creates a directory and `cd`s into it in one step |
| `extract` | `extract ` | Extracts an archive based on its extension. Supports `.tar.gz`/`.tgz`, `.tar.bz2`, `.tar.xz`, `.zip`, `.gz` |
| `ports` | `ports` | Shows listening ports and the processes using them (`sudo ss -tulpen`) |
| `psg` | `psg ` | Searches running processes by name (case-insensitive `ps aux | grep`) |
| `killport` | `killport ` | Kills whatever process is listening on the given port |
| `logtail` | `logtail [lines]` | Tails a log file (`-f`), default 50 lines, or specify a custom number |
| `reload` | `reload` | Reloads the zsh config (`source $ZDOTDIR/.zshrc`) without restarting the shell |
## Keybindings
| Key | Action | Notes |
|---|---|---|
| `Ctrl + →` | Move cursor forward one word | |
| `Ctrl + ←` | Move cursor backward one word | |
| `Ctrl + \` | Toggle autosuggestions on/off | Echoes "Autosuggestions: on/off" so you know the current state |
| `↑` (Up arrow) | Search history backward by prefix | Type a few characters first, then press Up to find matching previous commands |
| `↓` (Down arrow) | Search history forward by prefix | Same as above, opposite direction |
## Line editing (built-in zsh defaults)
These come from zsh's default "emacs" editing mode (the standard unless
something switches it to vi mode — this setup doesn't). Most of these
work in any emacs-style shell (bash, zsh) and are worth building into
muscle memory since they work everywhere.
### Cursor movement
| Key | Action |
|---|---|
| `←` / `→` | Move cursor one character left/right |
| `Ctrl + ←` / `Ctrl + →` | Move cursor one **word** left/right (custom binding in this setup) |
| `Ctrl + A` | Jump to the **start** of the line |
| `Ctrl + E` | Jump to the **end** of the line |
| `Alt + B` | Move backward one word (alternative to Ctrl+←) |
| `Alt + F` | Move forward one word (alternative to Ctrl+→) |
### Deleting / cutting text
| Key | Action |
|---|---|
| `Backspace` | Delete the character **before** the cursor |
| `Ctrl + D` / `Delete` | Delete the character **under/after** the cursor (Ctrl+D on an empty line exits the shell — careful) |
| `Ctrl + W` | Delete the **word before** the cursor (cuts to kill-ring) |
| `Alt + D` | Delete the **word after** the cursor (cuts to kill-ring) |
| `Alt + Backspace` | Same as Ctrl+W — delete word before cursor |
| `Ctrl + U` | Delete **everything before** the cursor (whole line back to start) |
| `Ctrl + K` | Delete **everything after** the cursor (to end of line) |
### Pasting (yanking) deleted text
zsh doesn't have "select text" like a GUI — instead, anything you cut
with `Ctrl+W`, `Alt+D`, `Ctrl+U`, or `Ctrl+K` goes into a clipboard-like
buffer (the "kill ring"), which you can paste back with:
| Key | Action |
|---|---|
| `Ctrl + Y` | Paste ("yank") the last cut text at the cursor |
**Practical example:** to move a word from the end of a command to the
start — put cursor at end of word, `Alt + Backspace` to cut it, `Ctrl + A`
to jump to the start of the line, `Ctrl + Y` to paste it there.
### Undo / retype
| Key | Action |
|---|---|
| `Ctrl + _` (Ctrl + Shift + -) | Undo the last edit |
| `Ctrl + L` | Clear the screen (same as the `c` alias, but doesn't lose scrollback the same way) |
### Transposing / fixing typos
| Key | Action |
|---|---|
| `Ctrl + T` | Swap the two characters around the cursor (fixes a typo like `hte` → `the`) — **note:** this is overridden by fzf's Ctrl+T in this setup if fzf is installed |
| `Alt + T` | Swap the two **words** around the cursor |
### Case changes
| Key | Action |
|---|---|
| `Alt + U` | Uppercase the word from the cursor onward |
| `Alt + L` | Lowercase the word from the cursor onward |
| `Alt + C` | Capitalize the word from the cursor onward |
### Re-running / editing previous commands
| Key | Action |
|---|---|
| `!!` | Re-run the last command (e.g. `sudo !!` re-runs the last command with sudo) |
| `!$` | The last **argument** of the previous command (e.g. `cat !$` opens whatever file you last referenced) |
| `Ctrl + R` (no fzf) | Reverse incremental search through history (built-in, before fzf takes over — see fzf section below for the upgraded version) |
| `fc` | Opens the last command in `$EDITOR` (nano) for editing, then runs it |
## Fuzzy search (fzf)
Only active if `fzf` is installed.
| Key | Action | Notes |
|---|---|---|
| `Ctrl + R` | Fuzzy search command history | Type to filter, select a command, it's inserted at the cursor. This overrides the built-in reverse search mentioned above |
| `Ctrl + F` | Fuzzy file search (includes hidden files, excludes `.git`) | Selected file path is inserted at the cursor. Uses `fd` if installed, otherwise falls back to `find` |
| `Ctrl + T` | Fuzzy file search (fzf's built-in, non-hidden files) | Only active if fzf's own shell integration is found on the system; uses `fd` for speed if installed. This overrides the built-in character-transpose shortcut mentioned above |
## Plugins (auto-loaded on shell startup)
These are cloned automatically into `$ZDOTDIR/plugins/` the first time
you start a shell after the role runs — no manual setup needed.
| Plugin | What it does |
|---|---|
| `zsh-autosuggestions` | Shows a greyed-out suggestion as you type, based on history. Press `→` (right arrow) or `End` to accept it |
| `fast-syntax-highlighting` | Colors commands as you type — valid commands, paths, strings, etc. get different colors so you can spot typos before pressing Enter |
## Environment / history
- History file: `~/.local/state/zsh/history`
- History size: 10,000 commands
- History behavior: shared across sessions, duplicates ignored, commands
starting with a space aren't recorded (`HIST_IGNORE_SPACE`)
- Default editor: `nano` (`$EDITOR` / `$VISUAL`)
- Config location: `$ZDOTDIR` = `~/.config/zsh/`
- Per-host extra env vars (e.g. `VAULT_ADDR`) are set via `zsh_extra_env`
in Ansible host_vars, appended to `env.zsh`
## Startup
`fastfetch` runs automatically every time a new shell opens, showing
system info (OS, kernel, uptime, packages, etc.) above the prompt.