Video summary

The Perfect Zsh Setup For 2026

Main summary

Key takeaways

Technology

Summary

A tutorial for building a minimal but powerful, fully controllable Zsh command-line workflow (no frameworks and no plugin manager). The setup focuses on:

  • faster navigation
  • better search (files + history)
  • nicer documentation display
  • a stylish prompt theme

Configuration is split into maintainable files and documented in a GitHub repo (with commands that differ for macOS/Arch/Ubuntu).


Goals / Problems Addressed

  • Terminal looks “default/ugly” out of the box
  • Navigation is slow and manual (cd, ls through directories)
  • History search is cumbersome
  • man pages and file previews are hard to read
  • Prompt lacks modern styling

Core Components Installed / Used

1) Zsh as default shell

  • Install Zsh (macOS already has it; Linux varies)
  • Set default shell using chsh and which zsh
  • Requires logout/login to apply

2) XDG-based configuration layout (system + user)

The tutorial emphasizes understanding Zsh config files, then using a cleaner directory structure.

Key files described

  • .zshrc: main config for interactive sessions (most setup goes here)
  • .zprofile: login shells (minimal; e.g., PATH on macOS via Homebrew recommendation)
  • .zlogin / Zlogout: login init / cleanup (not used in the tutorial)

System-wide environment file

  • Edit file described as: sudo nvim /etc/zsh... (described as zshenv)
  • It points to user config under: ~/.config/zsh
  • Uses XDG_CONFIG_HOME and ZDOTDIR conventions

User-specific config variables

Stored in: ~/.config/zsh/.zshenv, including:

  • cache / shared data / state locations (XDG-style)
  • editor ($EDITOR)
  • GPG_TTY
  • PATH additions (e.g., ~/.local/bin)

3) Interactive shell behavior + history improvements

In .zshrc:

  • History stored in an XDG state directory:
    • history size: 100,000
    • save history: 100,000
  • Options:
    • append to history
    • share history
    • ignore duplicates
    • ignore commands starting with a leading space
      • space-prefixed commands are omitted
    • expire duplicates first
    • setopt auto_cd (type a directory name to enter it)
    • disable terminal beep (no beep)
    • numeric sorting behavior for files (ensures correct ordering like 1..9 then 10..)

4) Faster navigation: zoxide

  • Install zoxide
  • Initialize it in .zshrc
  • Navigation improvements:
    • remembers directories you’ve visited
    • use z <name> <TAB> to jump
    • reduces time spent on manual cd/ls

5) Better search: FCF (fuzzy finder)

  • Install FCF (the video also mentions fzf; integration is clear even if terminology differs in subtitles)
    • fuzzy file/folder finding
    • fuzzy history search
  • System-specific config path differs for:
    • Homebrew (macOS)
    • Arch
    • Ubuntu
  • Key bindings shown:
    • Ctrl-T: fuzzy find files/dirs
      • includes hidden files
      • strips current directory prefix
    • Ctrl-R: fuzzy history search with preview
    • Alt-C: fuzzy directory navigation (jump directly to directories)
    • Ctrl-J / Ctrl-K and arrow keys: navigate selection UI

6) Nicer listing + faster utilities (Linux replacements)

Installs “better” alternatives:

  • exa (better ls, icons)
  • fd (better find, fast, nicer syntax)
  • ripgrep (better grep)
  • bat (better cat, nicer output)

Common aliases created (examples):

  • ls / ll / la using exa variants (icons, human-readable, include hidden, etc.)
  • tree for directory structure display
  • Git-related aliases kept minimal

Caution: Aliasing cat to bat can break scripts expecting plain cat output (line numbers/formatting differences). Ubuntu packaging may use batcat naming; the tutorial accounts for that.


7) Improve man page readability with bat

  • Update pager behavior so man pages render with bat
    • colorized
    • easier to read

8) Minimal “plugin manager” approach: lazy installation

Instead of a full plugin manager, the tutorial:

  • keeps a plugin directory inside the Zsh config directory
  • uses auto-install behavior when plugins are missing
  • provides a manual command like Z plugin update to refresh

Installed plugins (4 total) for a minimal feature set:

  • syntax highlighting
  • auto suggestions
  • history substring search
  • VI mode

9) Key bindings + VI mode UX tweaks

In bindings.zsh:

  • cursor style changes in VI mode:
    • block in command mode
    • beam in insert mode
  • disables command-mode highlight (reduces visual noise)
  • alternative bindings:
    • Ctrl+Right/Left: word-wise movement
    • Ctrl+F: file picker without hidden files (alternative to Ctrl-T)
    • Ctrl+\: toggles auto suggestions
    • Up/Down: substring search within history

10) Stylish prompt: Starship

  • Install Starship
  • Initialize it from .zshrc
  • Avoids default Starship preset theme; instead uses a custom starship.toml
  • Places starship.toml inside the repo-backed Zsh config directory for portability:
    • cloning the repo on another machine (including WSL) restores the prompt without extra theme setup
  • Prompt outcome:
    • simplified single-line prompt
    • shows contextual info like Git status

Configuration file modularization (tutorial structure)

The video splits Zsh configuration into multiple files:

  • fcf.zsh (FCF settings + Ctrl-T / Ctrl-R behavior)
  • aliases.zsh
  • bindings.zsh
  • plugins.zsh
  • prompt.zsh (Starship config)

Demonstrations (what the setup enables)

  • Ctrl-T: fuzzy file search with preview UI
  • Ctrl-R: fuzzy history search with preview
  • Directory jumping using Alt-C (and zoxide’s z ... TAB)
  • Enhanced ls behavior:
    • ll: normal listing
    • la: hidden files + improved formatting/icons
  • VI mode navigation and editing:
    • ESC to move/delete words
  • Substring history search (e.g., commands starting with sudo)
  • Syntax highlighting + auto-suggestions on typed commands

Mentioned alternative (not chosen)

  • Atuin is referenced as a history replacement.
  • The creator prefers FCF + Zsh history tools as “enough,” noting sync as a reason some people might like Atuin.

Main speakers / sources

  • Speaker/creator: the tutorial narrator (not explicitly named in subtitles)
  • Referenced source: FreeCodeCamp article used to understand Zsh config files
  • Documentation: the tutorial’s GitHub repository referenced throughout (link mentioned but not shown in subtitles)

Original video