Automated macOS terminal setup β tmux, neovim, and 40+ CLI tools with a consistent Catppuccin theme.
git clone https://github.com/ThibaultJRD/dotfiles.git
cd dotfiles
./install.shOpen Kitty, run tmux, you're ready. The script backs up existing configs before making changes.
| Category | Tool | Description | Launch |
|---|---|---|---|
| Terminal | Kitty | GPU-accelerated terminal | kitty |
| Shell | Zsh + Oh My Zsh | System default shell | default |
| Shell | Nushell | Structured data shell (tmux default) | nu |
| Prompt | Starship | Cross-shell prompt with vi mode indicators | auto |
| Multiplexer | Tmux | Terminal multiplexer with 12+ plugins | tmux |
| Sessions | sesh | Smart tmux session manager with project layouts | Prefix + o |
| Editor | Neovim (LazyVim) | Extensible text editor | v |
| Files | Yazi | Terminal file manager with previews | y |
| Git | Lazygit | Git TUI | lg |
| Git | gh | GitHub CLI | gh |
| Search | fzf | Fuzzy finder | Ctrl+T |
| Search | ripgrep | Fast text search | rg |
| Search | fd | Fast file finder | fd |
| Navigation | Zoxide | Smart cd (replaces cd) |
cd |
| History | Atuin | Shell history with fuzzy search | Ctrl+R |
| Viewer | bat | Syntax-highlighted cat | cat |
| Viewer | eza | Modern ls with icons | ls |
| Viewer | glow | Markdown renderer | glow |
| Viewer | jq / yq | JSON / YAML processors | jq, yq |
| Viewer | delta | Syntax-highlighted git diffs | auto |
| Monitor | btop | System resource monitor | btop |
| Completions | Carapace | Multi-shell completion engine | auto |
| Dev | Node.js via n | JavaScript runtime | node |
| Dev | Go | Go language | go |
| Dev | Rust via rustup | Rust toolchain | cargo |
| Dev | pnpm / yarn / bun | JS package managers | p |
| Docker | Lazydocker | Docker TUI | lazydocker |
| Utility | Lazyprune | Find and delete heavy cache dirs + kill processes by port | lazyprune |
Tmux is the hub of this setup. Everything runs inside it: sessions persist across restarts, panes navigate seamlessly into Neovim, and the status bar monitors your system.
tmux # new session
tmux new -s myproject # new named session
tmux a # attach to last sessionThe prefix is Ctrl+s β all tmux shortcuts start with it. Press Prefix + Space to open the which-key help menu and discover all available bindings.
| Key | Action |
|---|---|
Prefix + o |
Sesh β fuzzy session picker (tmux sessions, zoxide dirs, configs) |
Prefix + Tab |
Switch to last session |
Prefix + d |
Detach from current session |
Prefix + $ |
Rename session |
Sessions are managed by sesh. Connecting to a git repo automatically creates a 3-window layout (lazygit, nvim+terminal, AI terminal). Non-git directories get a simple terminal. The sesh.toml config is in sesh/.config/sesh/.
| Key | Action |
|---|---|
Prefix + c |
New window (preserves current path) |
Prefix + | |
Split pane horizontally |
Prefix + - |
Split pane vertically |
Ctrl+h/j/k/l |
Navigate between panes and Neovim splits |
Prefix + H/J/K/L |
Resize pane (5px increments, repeatable) |
Prefix + < |
Swap window left |
Prefix + > |
Swap window right |
Pane navigation uses vim-tmux-navigator β Ctrl+h/j/k/l moves between tmux panes and Neovim splits seamlessly, no prefix needed.
| Key | Action | Plugin |
|---|---|---|
Prefix + f |
Floating terminal overlay (80% screen) | tmux-floax |
Prefix + T |
Vimium-style copy hints (lowercase = copy, UPPERCASE = paste) | tmux-thumbs |
Prefix + u |
Fuzzy-find and open URLs from terminal output | tmux-fzf-url |
Prefix + Space |
Interactive keybinding help | tmux-which-key |
Prefix + r |
Reload tmux configuration | built-in |
Mouse is enabled for pane selection and resizing.
Top-positioned, showing: session name | windows | IP | CPU | RAM | battery (if available) | date/time
Tmux launches Nushell by default. To switch to Zsh, edit tmux/.config/tmux/tmux.conf:
# Change this line:
set -g default-command /opt/homebrew/bin/nu
# To:
set -g default-command /bin/zshThen reload with Prefix + r.
| Plugin | Purpose |
|---|---|
| tmux-sensible | Sane defaults |
| tmux-yank | System clipboard integration |
| vim-tmux-navigator | Seamless pane/split navigation |
| catppuccin/tmux | Catppuccin Macchiato theme |
| tmux-nerd-font-window-name | Nerd Font icons in window names |
| tmux-which-key | Keybinding discovery |
| tmux-cpu | CPU monitoring |
| tmux-battery | Battery status |
| tmux-primary-ip | Network IP display |
| tmux-floax | Floating terminal pane |
| tmux-fzf-url | URL picker |
| tmux-thumbs | Copy hints |
| sesh | Smart session manager (standalone CLI) |
Plugins are managed by TPM and installed automatically on first launch. To manually install: Prefix + I.
These work in both Zsh and Nushell:
| Key | Action |
|---|---|
Ctrl+T |
fzf file picker with bat/eza preview |
Ctrl+G |
Zoxide interactive directory picker with tree preview |
Ctrl+R |
Atuin history search (fuzzy, vi mode) |
Esc |
Toggle vi mode (cursor changes: beam = insert, block = normal) |
Vi mode is enabled in both shells with cursor shape feedback.
| Alias | Expands to | Description |
|---|---|---|
cat |
bat |
Syntax-highlighted file viewing |
lt |
eza --tree (2 levels) |
Tree view |
v |
nvim |
Neovim |
lg |
lazygit |
Git TUI |
p |
pnpm |
Package manager |
y |
yazi (cd-on-exit) | File manager |
| Alias | Expands to | Description |
|---|---|---|
ls |
eza (icons, git, colors) |
Enhanced file listing |
la |
eza -la (grouped dirs first) |
All files with details |
| Alias | Expands to | Description |
|---|---|---|
la |
ls -a (Nushell built-in) |
All files |
ll |
eza -la (grouped dirs first) |
All files with details |
| Alias | Command | Description |
|---|---|---|
gst |
git status |
Status |
gc |
git commit -m |
Commit with message |
gca |
git commit -a -m |
Commit all with message |
gp |
git push origin HEAD |
Push current branch |
gpu |
git pull origin |
Pull |
glog |
git log --graph (formatted) |
Visual commit graph |
gdiff |
git diff |
Show diff |
gco |
git checkout |
Checkout |
gb |
git branch |
List branches |
gba |
git branch -a |
List all branches |
ga |
git add -p |
Interactive patch staging |
gadd |
git add |
Stage files |
gcoall |
git checkout -- . |
Discard all changes |
gr |
git remote |
Remotes |
gre |
git reset |
Reset |
y [args] β Opens Yazi file manager. On exit, your shell cds to the last directory you browsed.
Built on LazyVim with these additions:
| Plugin | Purpose |
|---|---|
| copilot.vim | GitHub Copilot |
| vim-tmux-navigator | Seamless tmux pane navigation |
| snacks.nvim | File picker with hidden files |
| tokyonight.nvim | Colorscheme |
Ctrl+h/j/k/l navigates between Neovim splits and tmux panes β same keybindings, zero context switch. maplocalleader is set to ΓΉ. ESLint and Prettier integration enabled.
Launch with y. Uses vim-style keybindings:
| Key | Action |
|---|---|
h/j/k/l |
Navigate |
Enter |
Open file |
y / x / p |
Copy / Cut / Paste |
d |
Move to trash |
D |
Permanent delete |
a |
Create file/directory |
r |
Rename |
s |
Search by name (fd) |
S |
Search by content (rg) |
z |
Jump with fzf |
Z |
Jump with zoxide |
Space |
Select / deselect |
t |
New tab |
. |
Toggle hidden files |
w |
Task manager |
Previews supported for: images (ImageMagick), videos (ffmpeg), PDFs (poppler), SVGs (resvg), archives (7zip), code (bat with syntax highlighting).
Catppuccin across the entire stack:
- Mocha: Kitty, Starship, Yazi, Lazygit, bat, btop, Atuin, Nushell
- Macchiato: Tmux, fzf
- TokyoNight: Neovim (LazyVim default β change in
nvim/lua/plugins/tokyonight.lua)
Vi mode is enabled across all tools with cursor shape feedback:
- Insert mode: beam cursor (
|) - Normal mode: block cursor (
β)
Nerd Fonts installed:
- CaskaydiaCove β primary font (Cascadia Code with Nerd Font icons)
- VictorMono β italic font for code comments
- JetBrains Mono NL β symbol fallback
- Symbols Only β icon-only fallback
# Starship β edit starship/.config/starship/starship.toml
palette = 'your_palette'
# Kitty β edit kitty/.config/kitty/kitty.conf
include your-theme.conf
# Tmux β edit tmux/.config/tmux/tmux.conf
set -g @catppuccin_flavor 'your_flavor'# Create a file in the Zsh custom config directory (preserved across reinstalls)
echo 'alias myalias="my command"' > ~/.config/zsh/conf.d/custom.zsh- Add to
Brewfile:brew "your-tool" - Create config:
mkdir -p your-tool/.config/your-tool - Update
install.shif symlinks are needed - Run
./install.sh
- macOS Sonoma (14.0) or later
- Git and internet connection
- Installs Homebrew if missing
- Installs Oh My Zsh with plugins (syntax-highlighting, autosuggestions, completions, history-substring-search)
- Runs
brew bundleto install all packages fromBrewfile - Installs Rust toolchain and Lazyprune
- Creates symlinks from dotfiles to
~/.config/for each tool - Installs Node.js LTS via
n, Bun, and Atuin - Builds bat syntax theme cache
Existing config files are backed up with a timestamp suffix before symlinking.
./install.sh # safe to re-run β backs up existing files, skips installed packagesIcons not displaying β Make sure Kitty (or your terminal) is using a Nerd Font. Restart the terminal after font installation.
Tmux plugins not installed β Press Prefix + I (capital I) inside tmux to trigger TPM plugin installation.
Tool not found after install β Restart your terminal or run source ~/.zshrc. Check Homebrew health with brew doctor.
Config not applied β Verify symlinks exist: ls -la ~/.config/. Re-run ./install.sh if needed.
MIT β see LICENSE.
