Ten Terminal Tools That Changed My Data Science Workflow
Most data scientists spend their days in Jupyter notebooks and IDEs. But a surprising amount of daily friction happens in the terminal: navigating to project folders, searching through code, inspecting files, managing Python environments. These small inefficiencies add up.
Over the past year I’ve gradually replaced the default macOS terminal tools with modern alternatives. Each one is a small improvement on its own, but together they’ve changed how I work. Everything installs with a single Homebrew command, and the total setup takes about 15 minutes.
This post covers ten tools I now use daily. For each one: what it does, how to use it, and why it matters for data science work specifically.
Install everything at once
All tools are available through Homebrew:
brew install fzf zoxide bat eza ripgrep tmux uv
For the zsh plugins (if you use oh-my-zsh):
# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
fzf: fuzzy finder
An interactive fuzzy finder that lets you search files, command history and text with just a few keystrokes. It’s one of those tools where you wonder how you ever worked without it. https://github.com/junegunn/fzf#using-homebrew
| Shortcut | What it does |
|---|---|
Ctrl+R | Fuzzy search through command history |
Ctrl+T | Find files and insert path into command |
Alt+C | cd into a directory (fuzzy search) |
Where it shines for data science:
# Find and open a notebook
code $(fzf --query ".ipynb$")
# Search data files with preview
fzf --query ".csv$" --preview 'head -20 {}'
# Browse files with syntax-highlighted preview
fzf --preview 'bat --color=always {}'
# Search git history interactively
git log --oneline | fzf --preview 'git show {1}'
zoxide: a smarter cd
Zoxide remembers which directories you visit and lets you jump to them with partial names. After using it for a week, typing full paths feels like going back to a flip phone. https://github.com/ajeetdsouza/zoxide

# Instead of:
cd ~/Documents/Projects/DataScienceProjects/health-sync
# Just type:
z health
# Or even shorter, if the match is unique:
z hea
# Interactive mode with fzf integration:
zi
Add to your .zshrc:
eval "$(zoxide init zsh)"
bat: cat with syntax highlighting
A drop-in replacement for cat that adds syntax highlighting, line numbers and git integration. Makes reading code in the terminal actually pleasant. https://github.com/sharkdp/bat
# View a Python script with highlighting
bat model.py
# Show specific lines
bat -r 10:20 model.py
# Use as a pager for git diff
git diff | bat
# View JSON with proper formatting
bat config.json
eza: ls with git awareness
A modern ls replacement with colours, icons and git status indicators. Particularly useful for quickly seeing which files have been modified in a project. https://github.com/eza-community/eza/tree/main
# Detailed listing with git status
eza -la --git
# Tree view, 2 levels deep
eza -T -L 2
# Sort by modification time
eza -l --sort=modified
# Directories first
eza -la --group-directories-first

ripgrep: fast recursive search
An extremely fast search tool that automatically respects .gitignore and searches recursively. It’s written in Rust, and in practice it feels instant even on large codebases. https://github.com/BurntSushi/ripgrep

# Find function definitions
rg "def train_model"
# Search only Python files
rg "import pandas" -t py
# Search with context (3 lines before/after)
rg -C 3 "ValueError"
# Find all TODO/FIXME comments
rg "(TODO|FIXME)" -t py
# Find where a method is called
rg "\.fit\(" -t py
# Search in notebooks (they're JSON)
rg "pandas" --type-add 'notebook:*.ipynb' -t notebook
zsh-autosuggestions and syntax-highlighting
Two zsh plugins that improve your terminal experience immediately:
Autosuggestions shows a grey suggestion as you type, based on your command history. Press the right arrow key to accept, or keep typing to ignore. After a few days your fingers start accepting suggestions automatically.
Syntax highlighting colours your commands in real-time: green for valid commands, red for typos, underlined text for existing files. You catch errors before pressing Enter. https://gist.github.com/dogrocker/1efb8fd9427779c827058f873b94df95
# Add both to your oh-my-zsh plugins
plugins=(git python zsh-autosuggestions zsh-syntax-highlighting)
tmux: persistent terminal sessions
A terminal multiplexer that lets you split your screen, run multiple sessions, and keep everything alive when you close the terminal. Essential for long-running training jobs or remote work via SSH. https://tmux.info
| Shortcut | What it does |
|---|---|
Ctrl+b c | New window |
Ctrl+b % | Split vertically |
Ctrl+b " | Split horizontally |
Ctrl+b d | Detach from session |
Ctrl+b z | Zoom pane (toggle) |

A typical data science setup:
# Start a named session
tmux new -s project
# Split: code left, terminal right
# Ctrl+b %
# In the right pane, split again:
# Top: Jupyter server
# Bottom: git and tests
# Detach and go home
# Ctrl+b d
# Next day: pick up exactly where you left off
tmux attach -t project
uv: Python package management in Rust
A Python package installer written in Rust that’s 10-100x faster than pip. It’s a drop-in replacement that works with existing requirements.txt files. Once you’ve used it, waiting for pip feels painful. https://docs.astral.sh/uv/

# Create and activate a virtual environment
uv venv
source .venv/bin/activate
# Install the data science stack (takes seconds, not minutes)
uv pip install pandas numpy matplotlib seaborn scikit-learn jupyter
# Generate locked requirements
uv pip freeze > requirements.txt
Putting it all together: .zshrc configuration
Here’s the configuration that ties everything together. Add this to your ~/.zshrc:
# ===== Oh-My-Zsh Plugins =====
plugins=(git python zsh-autosuggestions zsh-syntax-highlighting)
# ===== Tool Initialisation =====
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
eval "$(zoxide init zsh)"
# ===== Aliases =====
alias cat='bat'
alias catp='bat -p'
alias ls='eza'
alias ll='eza -la --git'
alias lt='eza -T -L 2'
alias la='eza -la --group-directories-first'
alias rgi='rg -i'
alias rgpy='rg -t py'
# ===== fzf configuration =====
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob "!.git/*"'
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'
export FZF_CTRL_T_OPTS="--preview 'bat --color=always {}'"
# ===== Useful functions =====
# fzf with bat preview
fzp() {
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'
}
# cd to directory with fzf
fcd() {
cd "$(find . -type d | fzf --preview 'eza -la {}')"
}
# Search git history with fzf
fgh() {
git log --oneline | fzf --preview 'git show --color=always {1}'
}
Quick reference
| Tool | Replaces | Key command |
|---|---|---|
| fzf | manual searching | Ctrl+R, Ctrl+T |
| zoxide | cd | z dirname |
| bat | cat | bat file.py |
| eza | ls | ll |
| ripgrep | grep | rg "pattern" |
| autosuggestions | typing | right arrow to accept |
| syntax-highlighting | guessing | automatic |
| tmux | multiple terminals | Ctrl+b prefix |
| uv | pip | uv pip install |
All of these tools are free, open source, and available through Homebrew. The complete setup takes about 15 minutes, and you’ll feel the difference on day one. If you’re already comfortable in the terminal, these tools remove the remaining friction. If you’re not, they make the terminal a much friendlier place to work.