My Terminal Setup: Ghostty + Zsh Configuration for a Modern Development Environment

Sarthak WSarthak W
5 min read

Setting up a productive terminal environment is crucial for any developer. After experimenting with various terminal emulators and shell configurations, I've settled on a powerful combination: Ghostty terminal with a heavily customized Zsh setup. Here's a deep dive into my configuration that has significantly improved my daily workflow.

Why This Setup?

Before diving into the configuration details, let me explain why I chose this particular combination:

  • Ghostty: A fast, feature rich terminal emulator with excellent macOS integration

  • Zsh with Oh My Zsh: Powerful shell with extensive plugin ecosystem

  • Modern CLI tools: Enhanced versions of traditional Unix tools for better productivity

Ghostty Terminal Configuration

Ghostty is my terminal emulator of choice due to its performance and customization options. Here's my configuration breakdown:

Visual Aesthetics

theme = Brogrammer
font-size = 14
font-family = JetBrainsMonoNL Nerd Font Mono
background-opacity = 0.9
background-blur-radius = 20
macos-icon = xray

Key choices explained:

  • Brogrammer theme: A dark, high contrast theme that's easy on the eyes during long coding sessions

  • JetBrains Mono Nerd Font: Excellent for coding with ligatures and icon support

  • Semi-transparent background: Creates a modern, layered desktop experience while maintaining readability

macOS Integration

macos-titlebar-style = transparent
macos-option-as-alt = true
window-padding-balance = true
window-save-state = always
window-colorspace = "display-p3"

These settings ensure Ghostty feels native on macOS while providing enhanced functionality like proper Alt key behavior and state persistence.

User Experience Enhancements

mouse-hide-while-typing = true
cursor-style-blink = false
cursor-invert-fg-bg = true
desktop-notifications = true

Small details that make a big difference in daily usage the cursor stays visible but doesn't blink (less distracting), and the mouse automatically hides when typing.

Zsh Configuration Deep Dive

My Zsh setup is built around Oh My Zsh with carefully selected plugins and modern CLI tool integrations.

Core Framework Setup

export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME=""  # Using Starship instead
plugins=(git zsh-syntax-highlighting zsh-autosuggestions z fzf-tab)

Plugin breakdown:

  • git: Essential Git aliases and branch information

  • zsh-syntax-highlighting: Real time command syntax highlighting

  • zsh-autosuggestions: Fish like autosuggestions based on history

  • z: Smart directory jumping based on frequency

  • fzf-tab: Fuzzy finder integration for tab completion

Modern CLI Tools Integration

FZF (Fuzzy Finder)

source <(fzf --zsh)
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border"
export FZF_CTRL_T_OPTS="
  --walker-skip .git,node_modules,target
  --preview 'bat -n --color=always {}'
  --bind 'ctrl-/:change-preview-window(down|hidden|)'
  "

FZF transforms how I navigate files and command history. The preview integration with bat shows file contents instantly.

Enhanced Directory Listing with Eza

alias l="eza --icons"
alias ls="eza --icons"
alias ll="eza -lg --icons"
alias la="eza -lag --icons"
alias lt="eza -lTg --icons"  # Tree view

Eza replaces ls with a modern, colorful alternative that shows file icons and better formatting.

Starship Prompt

eval "$(starship init zsh)"

Starship provides a fast, customizable prompt that shows relevant context (Git status, Python virtual env, etc.) without being overwhelming.

Development Environment Setup

Programming Languages

export JAVA_HOME=$(/usr/libexec/java_home -v 21)
export PATH="$HOME/go/bin:$PATH"
export PNPM_HOME="/Users/sarth/Library/pnpm"
eval "$(rbenv init - zsh)"

Configured paths for Java 21, Go, Node.js (via pnpm), and Ruby (via rbenv).

Editor Integration

export EDITOR="nvim"
export VISUAL="nvim"

Neovim as the default editor for Git commits and other CLI operations.

Smart Git Workflows

I've created several FZF-integrated Git aliases that make version control much more interactive:

alias gafzf='git ls-files -m -o --exclude-standard | grep -v "__pycache__" | fzf -m --print0 | xargs -0 -o -t git add'
alias gbfzf='git branch | fzf | xargs git checkout'
alias grfzf='git diff --name-only | fzf -m --print0 | xargs -0 -o -t git restore'

These allow me to:

  • Select multiple files to stage using fuzzy search

  • Switch branches interactively

  • Restore files with visual selection

File Management Integration

Yazi File Manager

function y() {
    local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
    yazi "$@" --cwd-file="$tmp"
    IFS= read -r -d '' cwd < "$tmp"
    [ -n "$cwd" ] && [ "$cwd" != "$PWD" ] && builtin cd -- "$cwd"
    rm -f -- "$tmp"
}

This function integrates Yazi (a TUI file manager) so that when I exit, my shell's working directory updates to match where I navigated in Yazi.

Zoxide for Smart Navigation

eval "$(zoxide init --cmd cd zsh)"

Zoxide learns my directory usage patterns and lets me jump to frequently used directories with just a few characters.

The Result: A Cohesive Workflow

This configuration creates a terminal environment where:

  1. Visual appeal meets functionality - The semi-transparent Ghostty window with blur effects looks modern while the Brogrammer theme ensures readability

  2. Intelligent autocompletion - Between zsh-autosuggestions, fzf-tab, and various fuzzy finder integrations, I rarely type full commands or paths

  3. Context-aware prompt - Starship shows exactly what I need to know about my current environment

  4. Seamless Git integration - Interactive file selection and branch switching make version control effortless

  5. Modern tool replacements - Enhanced versions of basic commands (ls → eza, cd → zoxide) that provide more information and better UX

Tips for Adopting This Setup

If you're interested in trying a similar configuration:

  1. Start with the basics: Install Oh My Zsh and a few essential plugins first

  2. Add tools gradually: Don't try to adopt every tool at once - add them one by one as you get comfortable

  3. Customize to your needs: My aliases and functions reflect my workflow - adapt them to yours

  4. Use Nerd Fonts: Essential for proper icon display in modern CLI tools

  5. Experiment with themes: Both terminal and shell themes can significantly impact your daily experience

Performance Considerations

This setup is optimized for performance:

  • Starship is written in Rust and starts quickly

  • Lazy loading for some features to avoid startup delays

  • Efficient plugin selection to minimize shell startup time

The result is a terminal that starts fast but provides powerful functionality when needed.

Conclusion

A well configured terminal environment is an investment in your productivity. This setup has transformed how I interact with my development environment, making common tasks faster and more enjoyable. The combination of modern tools with thoughtful configuration creates a workspace that feels both powerful and pleasant to use.

Whether you adopt this exact configuration or use it as inspiration for your own setup, the key is finding tools that enhance rather than complicate your workflow. Happy coding!


What's your terminal setup like? I'd love to hear about your favorite tools and configurations in the comments below.

0
Subscribe to my newsletter

Read articles from Sarthak W directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sarthak W
Sarthak W