Unleashing Productivity with a Customized Zsh Terminal

Sidharthan Chandrasekaran Kamaraj
The Bug Shots
Published in
5 min readSep 16, 2023

The terminal is a developer’s playground, and customizing it can significantly boost your productivity. In this blog post, I’ll walk you through my Zsh terminal configuration, including the shell prompt, plugins, and additional tools that I use to streamline my workflow. By the end of this post, you’ll have a comprehensive understanding of how to supercharge your terminal setup.

Starship Prompt: A Versatile and Customizable Command Prompt

The command prompt is your gateway to the terminal, and Starship takes it to the next level. Here’s a closer look at why I prefer it:

Customizability Beyond Compare: Starship’s configuration is based on a simple TOML file, making it incredibly approachable for customization. You can define not only the prompt’s appearance but also its behavior. Want to display the current Git branch, Python version, and virtual environment? Starship can do that.

Language Detection: Starship can intelligently detect the programming language of your current project. For instance, if you’re in a Python project directory, it will display a Python logo and provide information related to Python. This dynamic adaptation ensures your prompt is always context-aware.

Multi-Shell Compatibility: Starship isn’t just for Zsh enthusiasts; it’s designed to work across multiple shells. Whether you switch between Zsh, Bash, Fish, or even PowerShell, you can have a consistent and feature-rich prompt experience.

To install Starship, follow the instructions on their official website.

Supercharging Zsh with Plugins

Zsh’s extensibility is one of its greatest strengths. With an array of plugins at your disposal, you can fine-tune your shell to perfection. Let’s explore the plugins that enhance my Zsh experience:

Kubectl Plugin: Kubernetes is a cornerstone of modern containerized applications. The kubectl plugin provides auto-completions and suggestions for kubectl commands, streamlining your interaction with Kubernetes clusters.

zsh-autosuggestions: This plugin takes inspiration from modern text editors. As you type, it predicts and suggests commands based on your history and habits, reducing keystrokes and minimizing typos.

zsh-syntax-highlighting: Command syntax highlighting is more than just eye candy; it’s a real-time error prevention tool. With this plugin, your commands are color-coded to highlight potential mistakes, helping you identify mistakes in commands as you type them in the terminal.

you-should-use: It’s easy to forget the optimal command in a given situation. This plugin acts as your knowledgeable assistant, suggesting better alternatives to the commands you’re using. It’s like having a mentor in your terminal.

alias-finder: Managing aliases can become unwieldy, especially if you have many of them. The alias-finder plugin simplifies the process by allowing you to search for and discover your aliases effortlessly.

FZF: The Ultimate Fuzzy Finder

Traditional command history search (Ctrl + R) can be a hit or miss, especially as your history grows. Enter FZF (Fuzzy Finder), a remarkable tool for searching through your history and finding files:

Efficient and Intuitive Searching: FZF introduces a fuzzy search mechanism that understands typos and incomplete input. It prioritizes and ranks results based on relevance, making it an intuitive and efficient way to locate the command you need.

Versatile File Navigation: Beyond history, FZF extends its capabilities to file navigation. You can seamlessly locate and open files with just a few keystrokes, simplifying your interactions with your file system.

Customizable Keybindings: FZF’s flexibility doesn’t stop at search behavior. You can create custom keybindings to tailor the tool to your specific preferences and workflow.

Zoxide: Your Path to Effortless File Navigation

File navigation is a fundamental aspect of terminal usage, and Zoxide takes it to the next level:

Intelligent Path Suggestion: Zoxide’s magic lies in its ability to predict the path you want to navigate to based on your usage patterns. This means less time spent manually traversing directories and more time focused on your tasks.

Interactive Directory Jumping: With Zoxide, changing directories becomes an interactive experience. A simple ‘z’ command followed by a search term takes you directly to your desired directory.

Cross-Shell Compatibility: Just like Starship, Zoxide is not confined to a single shell. You can use it with Zsh, Bash, Fish, and others, ensuring a consistent experience across different shell environments.

TIP: I created an alias for zoxide with alias cd=z in the ~/.zshrc file so that my workflow is unchanged :)

Conclusion

Your terminal is more than just a command line; it’s your productivity hub. By configuring Zsh with Starship and essential plugins, embracing FZF for efficient searches, and adopting Zoxide for intuitive file navigation, you can transform your terminal into a powerhouse of productivity.

Experiment with these tools, fine-tune them to your liking and watch your terminal experience become more intuitive, efficient, and enjoyable. Whether you’re a seasoned developer or just starting your journey, a well-crafted terminal setup can make a world of difference in your daily workflow.

Originally posted at https://thebugshots.dev

Below is my basic `.zshrc` file

ZSH_THEME="frisk" # set by `omz`

# Path to your oh-my-zsh installation.
export ZSH="$HOME/.oh-my-zsh"

fpath+=${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions/src
source $ZSH/oh-my-zsh.sh

export GOROOT="/opt/homebrew/Cellar/go/1.21.0/libexec"
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

# Startship Config
eval "$(starship init zsh)"
export STARSHIP_CONFIG=~/.config/starship/starship.toml

# Zoxide
eval "$(zoxide init zsh)"
alias cd="z"

plugins=(
kubectl
git
alias-finder
history
zsh-autosuggestions
zsh-syntax-highlighting
you-should-use
)

# Syntax Highlighting
source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
export ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR=/opt/homebrew/share/zsh-syntax-highlighting/highlighters

# Example aliases
alias zshconfig="mate ~/.zshrc"
alias ohmyzsh="mate ~/.oh-my-zsh"
alias home="cd ~"

export BAT_THEME="Monokai Extended Bright"

[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh

# Kubectl alias
alias k="kubectl"

# Kubernetes Autocompletions
autoload -Uz compinit
compinit
source <(kubectl completion zsh)

# Go
alias makedeps="go mod download && go mod tidy && go mod verify && go mod vendor"

source /Users/sid/.docker/init-zsh.sh || true # Added by Docker Desktop

Below is the starship.toml file.

# Don't print a new line at the start of the prompt
add_newline = true

# Replace the "❯" symbol in the prompt with "➜"
[character] # The name of the module we are configuring is "character"
error_symbol = "✗"

# Disable the package module, hiding it from the prompt completely
[package]
disabled = true

[battery]
disabled = false
full_symbol = "🔋 "
charging_symbol = "⚡️ "

[[battery.display]] # "bold red" style when capacity is between 0% and 10%
threshold = 10
style = "bold red"

[[battery.display]] # "bold yellow" style when capacity is between 10% and 30%
threshold = 30
style = "bold yellow"

[[battery.display]]
threshold = 70
style = "bold blue"

[[battery.display]]
threshold = 100
style = "bold green"

[directory]
# truncation_length = 4

# docker
[docker_context]
symbol = "🐋 "
disabled = false

# git
[git_commit]
commit_hash_length = 6

[git_status]
style="dimmed green"
up_to_date = "[✓](green)"
staged = '[++\($count\)](green)'

# hostname
[hostname]
ssh_only = false
prefix = "⟪"
suffix = "⟫"
trim_at = ".companyname.com"
disabled = true

# kubernetes
[kubernetes]
format = 'on [⎈ ($cluster) ](#FFA500)'
style = "dimmed green"
disabled = false

--

--