Terminal & CLI Productivity Tools: tmux, zsh, fzf, ripgrep & More for Developers

Transform your terminal with zsh, tmux, fzf, ripgrep, and modern CLI alternatives. Step-by-step setup guide for macOS and Linux in 2025.

  • MIT
  • Updated 2026-05-18

{</* resource-info */>}

Developers spend hours each day in the terminal. A well-configured shell environment saves minutes on every task โ€” compounding into hours of reclaimed productivity each week. In 2025, the terminal ecosystem has never been richer. Tools like zsh, tmux, fzf, and ripgrep transform the command line from a bare prompt into a powerful, customized workspace.

This guide covers the essential tools, their configuration, and how they fit together into a cohesive terminal setup. Whether you are on macOS or Linux, following this guide will give you a terminal environment that matches โ€” or exceeds โ€” the productivity of a modern IDE.

Why Terminal Efficiency Matters for Developers #

The terminal is the universal interface for development. IDEs come and go, but the command line persists across languages, frameworks, and operating systems. A developer fluent in terminal tools navigates codebases faster, automates repetitive tasks, and debugs systems more effectively than one relying solely on graphical tools.

The tools in this guide share a common philosophy: do one thing well, compose with other tools, and respect the developer’s time. Each tool replaces or enhances a standard Unix utility, providing better defaults, faster performance, or richer interactivity.

Shell Upgrade: Why zsh Replaces bash #

zsh (Z Shell) has been the default shell on macOS since Catalina (2019) and is the preferred shell for most power users on Linux. It is fully compatible with bash syntax while adding features that dramatically improve daily use: shared command history across sessions, spelling correction, globbing enhancements, and a massive plugin ecosystem through Oh My Zsh.

Oh My Zsh is a community-driven framework with over 300 plugins and 140 themes. Installation takes one command:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Four plugins deliver the biggest productivity gains. The git plugin adds aliases like gst for git status, gp for git push, and gl for git pull. The z plugin tracks your most-used directories and enables jumping with z partial-name. The zsh-autosuggestions plugin suggests commands based on history as you type. The zsh-syntax-highlighting plugin provides real-time syntax validation, turning invalid commands red before you press Enter.

For themes, Powerlevel10k is the most popular choice in 2025. It renders a fast, informative prompt with git status, command execution time, and directory context โ€” all without lag. Installation instructions are at the Oh My Zsh website.

Custom aliases are where the real speed gains live. Add these to your ~/.zshrc:

alias ..='cd ..'
alias ...='cd ../..'
alias gs='git status'
alias gp='git pull'
alias dc='docker compose'
alias k='kubectl'

tmux: The Terminal Multiplexer Every Developer Needs #

tmux solves a problem every terminal user faces: managing multiple terminal sessions. Without tmux, closing your terminal window kills running processes. With tmux, sessions persist on a server, detached from any specific terminal window. You can start a build, close your laptop, reconnect from another machine, and the build is still running.

tmux organizes work into three hierarchical concepts. Sessions are the top level โ€” a collection of windows. Windows are tabs within a session, each showing a different task. Panes divide a window into multiple sections, each running an independent shell. A typical setup might have one session per project, multiple windows per session (editor, tests, logs), and 2-3 panes per window.

The essential key bindings follow a prefix-key pattern. The default prefix is Ctrl+B. Press Ctrl+B, then % to split vertically, " to split horizontally, arrow keys to navigate between panes, c to create a new window, n to go to the next window, and d to detach from the session. Reattach with tmux attach.

A productive .tmux.conf starts with these settings:

# Change prefix to Ctrl+A (easier to reach)
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# Enable mouse support
set -g mouse on

# Start window numbering at 1
set -g base-index 1
setw -g pane-base-index 1

# Use 256 colors
set -g default-terminal "screen-256color"

tmux Plugin Manager (TPM) adds functionality without complexity. Install TPM, then add plugins like tmux-resurrect (save and restore sessions across reboots) and tmux-yank (copy to system clipboard). The tmux GitHub repository has the latest release notes and feature additions.

Pair programming with tmux is straightforward. Two developers SSH into the same server, attach to the same tmux session, and see identical screens. Either can type, with changes appearing on both terminals in real time. This beats screen sharing for remote collaboration โ€” no video lag, no resolution issues, just shared terminal state.

fzf: Interactive Fuzzy Finding #

fzf is a general-purpose command-line fuzzy finder. It takes any list โ€” files, directories, command history, git branches โ€” and provides an interactive interface for filtering it. fzf is not a search tool itself; it is a filter that makes other tools interactive.

Install fzf via your package manager or Git. On macOS: brew install fzf. On Ubuntu: apt install fzf. Then run the install script to set up key bindings.

The most transformative integration is with shell history. Press Ctrl+R and fzf replaces the default history search with an interactive, fuzzy-filtered list. Type fragments of a previous command in any order, and fzf narrows the list in real time. Finding that complex Docker command from three weeks ago takes seconds instead of scrolling through hundreds of history entries.

The Ctrl+T binding inserts a fuzzy-found file path at the cursor. Alt+C cd’s into a fuzzy-found directory. These three key bindings alone justify installing fzf.

Combined with ripgrep, fzf becomes a code search powerhouse:

rg --files | fzf --preview 'bat --style=numbers --color=always {}'

This command lists all files in a project (filtered through fzf), with a syntax-highlighted preview of each file as you navigate. The fzf GitHub repository includes extensive documentation and example scripts.

ripgrep (rg) is a line-oriented search tool that recursively searches your current directory for a regex pattern. It is built by Andrew Gallant and has become the default code search tool for developers in 2025. It replaces grep, ack, and The Silver Searcher (ag) for most use cases.

ripgrep is fast. On a warm cache, it searches the Linux kernel source (over 25 million lines) in under one second. This speed comes from several optimizations: parallel directory traversal, automatic filtering by file type, .gitignore respect by default, and memory-mapped file reading. The ripgrep GitHub repository contains detailed benchmark data comparing rg against grep, ag, ack, and git grep.

The smart defaults are what make ripgrep feel effortless. It respects .gitignore files automatically, skips hidden files and binary files, and detects the encoding of each file. You do not need flags for the common case โ€” just rg "pattern" searches your project intelligently.

Common search patterns every developer should know:

# Search for a pattern in specific file types
rg "function" --type js

# Show surrounding context lines
rg "pattern" -C 3

# Search only in changed files (compared to git HEAD)
rg "pattern" $(git diff --name-only)

# List all files containing a pattern (like grep -l)
rg -l "pattern"

# Replace grep with inverted search
rg -v "pattern"

ripgrep integrates with every major editor. VS Code uses ripgrep for its search functionality. Vim users combine rg with fzf for :Rg search. Emacs users have rg.el for projectile integration.

Modern Replacements for Classic Unix Tools #

A wave of Rust and Go-based tools has reimagined standard Unix utilities with better defaults, color output, and modern UX. These are the replacements worth adopting in 2025:

Classic ToolModern ReplacementKey Improvement
lsezaColors, git status, tree view, icons
catbatSyntax highlighting, git integration, pager
findfdSimpler syntax, respects .gitignore, faster
dudufColorful, sortable, human-readable output
psprocsColorful, tree view, container awareness
sedsdIntuitive syntax, no regex escaping
diffdeltaSyntax-highlighted diffs, side-by-side view
mantldrPractical examples, not exhaustive reference

bat is the most impactful replacement. It syntax-highlights any file, shows git modification indicators in the gutter, and pipes through a pager automatically. Replace cat with bat and you get an immediate visual upgrade with zero workflow disruption.

eza (a community fork of exa) replaces ls with a colorful, informative listing that shows git status indicators, file sizes in human-readable format, and optional icons. The command eza -la --git --icons gives you a full directory overview that would require multiple ls flags to approximate.

sd replaces sed for interactive find-and-replace tasks. Where sed requires sed -i 's/old/new/g' file, sd uses sd 'old' 'new' file. No regex escaping nightmares, no remembering flag syntax. For scripting, sed remains relevant. For human use, sd is the better tool.

Starship: A Minimal, Fast Cross-Shell Prompt #

Starship is a shell prompt written in Rust that works with bash, zsh, fish, and PowerShell. It shows git branch and status, programming language versions (Node, Python, Rust), command execution time, and directory context โ€” all asynchronously so your prompt never lags.

Configuration lives in ~/.config/starship.toml. A minimal config for developers:

[git_branch]
symbol = " "

[git_status]
ahead = "โ‡ก${count}"
behind = "โ‡ฃ${count}"

[nodejs]
disabled = false

[python]
disabled = false

[cmd_duration]
min_time = 500
format = "took [$duration](bold yellow)"

Starship starts instantly, updates asynchronously, and uses zero resources when idle. It is the best prompt for developers working across multiple languages and git repositories. See starship.rs for the full configuration reference.

Managing Your Dotfiles #

With this many tools, configuration management becomes essential. The most popular approach in 2025 is a Git repository of dotfiles managed with GNU Stow. Stow creates symlinks from a central repository to your home directory, making it trivial to keep configs synchronized across machines.

An alternative is chezmoi, which handles machine-specific differences through templates. If your work laptop needs different Git credentials than your personal machine, chezmoi’s templating solves this elegantly.

Both approaches beat copying files manually. Choose Stow for simplicity, chezmoi for machine-specific configurations.

macOS Terminal Setup: iTerm2 + Homebrew #

For macOS users, iTerm2 is the best terminal emulator. It supports split panes, search, autocomplete, and a GPU-accelerated renderer. Key features include: paste history, instant replay (scroll back through session output even after clearing), and trigger-based alerts.

Install all tools through Homebrew:

brew install tmux fzf ripgrep bat eza fd duf procs sd delta starship

Add eval "$(starship init zsh)" to your ~/.zshrc after Oh My Zsh loads. Enable fzf key bindings with $(brew --prefix)/opt/fzf/install.

Linux Terminal Setup: Alacritty + Package Manager #

On Linux, Alacritty is the fastest terminal emulator. It uses the GPU for rendering, making it noticeably faster than GNOME Terminal or Konsole for large output streams. Kitty is an alternative with more features (tabs, splits, image previews) at a slight performance cost.

Install the tool suite through your distribution’s package manager:

# Ubuntu/Debian
sudo apt install tmux fzf ripgrep bat eza fd-find duf procs

# Arch Linux
sudo pacman -S tmux fzf ripgrep bat eza fd duf procs sd starship

# Fedora
sudo dnf install tmux fzf ripgrep bat eza fd-find duf procps-ng

Note that some packages have different names across distributions. fd is fd-find on Debian-based systems. procs may not be available in older repositories โ€” install via cargo if needed.

Essential Aliases and Functions #

Add these aliases to your ~/.zshrc for daily workflow speed:

# Git workflow
ga() { git add "$@" }
gc() { git commit -m "$1" }
gp() { git push }

dev() { cd ~/dev/$1 }

# Docker shortcuts
dcu() { docker compose up -d }
dcd() { docker compose down }
dcl() { docker compose logs -f }

Functions that take arguments (like gc "message") are more flexible than static aliases. Combine with zsh’s tab completion for a fluid workflow.

Conclusion #

A modern terminal setup stacks multiple specialized tools, each doing one job exceptionally well. Start with zsh and Oh My Zsh for shell improvements. Add tmux for session management. Install fzf and ripgrep for search. Replace classic tools with modern alternatives as you discover them. Configure Starship for a fast, informative prompt.

The investment in terminal tooling pays continuous dividends. Unlike framework-specific skills that deprecate, terminal proficiency improves your effectiveness across every project and technology stack you touch.


FAQ #

What is the best terminal setup for developers in 2025?

The most productive setup combines zsh with Oh My Zsh, tmux for session management, fzf for interactive filtering, ripgrep for code search, and modern tool replacements like bat, eza, and sd. On macOS, use iTerm2 as your terminal emulator. On Linux, Alacritty or Kitty. Manage your dotfiles with GNU Stow or chezmoi to keep configurations synchronized.

Is tmux better than GNU screen?

tmux has largely replaced screen for new setups. It offers a more intuitive key binding scheme, better default configuration, active development, and a larger plugin ecosystem (through TPM). Screen still works and is pre-installed on many servers, but tmux provides a better user experience for daily development. For remote server sessions where tmux may not be installed, knowing basic screen commands remains useful.

How do I make my terminal look better?

Start with a good terminal emulator (iTerm2 on macOS, Alacritty on Linux). Install a Nerd Font like “MesloLGS NF” for icon support. Use Starship or Powerlevel10k for a feature-rich prompt. Replace ls with eza --icons, cat with bat, and enable syntax highlighting in your shell. Enable true color support with export TERM=xterm-256color. These changes take under 30 minutes and transform the visual experience.

What is the difference between fzf and ripgrep?

fzf is an interactive fuzzy finder โ€” it filters lists interactively but does not search file contents. ripgrep is a content search tool โ€” it searches inside files for regex patterns but is not interactive. They are complementary: use ripgrep to find files containing a pattern, pipe the results to fzf for interactive selection, and use bat for preview. The combination rg --files | fzf --preview 'bat {}' gives you a complete interactive search workflow.

Can I use these tools on Windows?

Yes, through Windows Subsystem for Linux (WSL2). WSL2 provides a full Linux environment where all tools in this guide work natively. Install a WSL2 distribution (Ubuntu is recommended), then follow the Linux setup instructions. For native Windows, some tools have Windows builds (fzf, ripgrep, starship), but the experience is smoother under WSL2. Windows Terminal is the recommended terminal emulator for WSL2 users.


To run any of the tools above reliably 24/7, infrastructure matters:

  • DigitalOcean โ€” $200 free credit, 14+ global regions, one-click droplets for AI/dev workloads.
  • HTStack โ€” Hong Kong VPS with low latency for mainland China access. This is the same IDC hosting dibi8.com โ€” production-proven.

Affiliate links โ€” no extra cost to you, helps keep dibi8.com running.

๐Ÿ’ฌ Discussion