Sandbox99 Chronicles

Build the Ultimate Terminal on Linux: WezTerm + Zsh + Powerlevel10k

Wezterm

Written by Jose Mendez

Hi, I’m Jose Mendez, the creator of sandbox99.cc. with a passion for technology and a hands-on approach to learning, I’ve spent more than fifteen years navigating the ever-evolving world of IT.

Published May 29, 2025 | Last updated on May 29, 2025 at 4:18PM

Reading Time: 5 minutes

🚀 Introduction

I recently made the leap from Linux Mint to Pop!_OS, and its default GNOME Terminal can feel pretty basic, especially if you’re coming from a setup like mine. On my macOS, I’ve long enjoyed a modern, visually rich, and highly customizable terminal experience, and I even had a similar setup on Linux Mint. Now, I want to show you how I brought that same level of polish to Pop!_OS using WezTerm. It’s a fantastic GPU-accelerated, feature-rich terminal emulator with awesome features like pane multiplexing, tab support, ligature rendering, and smooth performance across the board.

In this blog post, I’ll walk you through setting up a fantastic terminal environment in Linux using:

  • WezTerm – a GPU-accelerated terminal emulator with modern features like ligature support, tabbed UI, and multiplexing.
  • FiraCode Nerd Font – a developer-friendly font with support for programming ligatures and custom glyphs.
  • Oh My Zsh – a community-driven framework for managing your Zsh configuration.
  • Powerlevel10k theme – a sleek, fast theme for Zsh with support for icons, git status, and more.
  • Useful Zsh plugins like zsh-autosuggestions and zsh-syntax-highlighting.

Let’s build your dream terminal. 😎

1️⃣ Install WezTerm Terminal

# Debian/Ubuntu-based systems
sudo apt update
sudo apt install -y curl

curl -LO https://github.com/wez/wezterm/releases/download/nightly/wezterm-nightly.Ubuntu22.04.deb
sudo apt install ./wezterm-nightly.Ubuntu22.04.deb

You’ll need to visit their GitHub repository to download the appropriate binary file for your specific Linux distribution. For instance, I’m running Pop OS, which is built on Ubuntu 22.04.

Note: Upon successful installation, you should see the WezTerm icon like this.

2️⃣ Install FiraCode Nerd Fonts

mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/FiraCode.zip
unzip FiraCode.zip
fc-cache -fv

Note: Upon successful installation, you should see in this directory listing.

Create a WezTerm config file:

# from nano editor
nano ~/.wezterm.lua

# from vim editor
vim ~/.wezterm.lua

Then, set FiraCode Nerd Font as the font in WezTerm’s config file (~/.wezterm.lua).

local wezterm = require 'wezterm'

return {
  font = wezterm.font("FiraCode Nerd Font"),
  font_size = 14.0,
  window_decorations = "RESIZE",
  window_background_opacity = 0.8,
  enable_tab_bar = true,
  hide_tab_bar_if_only_one_tab = false,
}

3️⃣ Install Oh My Zsh

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

“Once Oh-My-Zsh is installed, your WezTerm will look like this:” (Slightly more predictive.)

4️⃣ Powerlevel10k Theme + Plugins

✅ Install Powerlevel10k

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

Edit ~/.zshrc and set:

ZSH_THEME="powerlevel10k/powerlevel10k"

Restart the terminal and follow the configuration wizard.

Select Yes, the succeeding wizard question related to lock icon and upward arrow icon, select Yes

Select 1, It is pointing at ‘1’

Select Yes

Just select your prompt style to customize it further. In the next window select 1 for Unicode. In next windows select 1 for 256 colors.

Select if you want put a current time as part of your prompt customization. In the next window select if you want single or two lines. In my case I would prefer two lines. In the next windows is related to Prompt Connection please select which do you prefer.

In the Prompt Frame selection please select which do you prefer? In the next window it will ask Prompt spacing. In my case I would go for option 2 Sparse. In the last section is the Prompt Icons which do you prefer? In my case I select option 2 Many icons. In the next window it will ask Prompt flow, which do you prefer? In my case I select option 1 Concise. Next window will ask Enable Transient Prompt? I would preferred No option.

In this window select option 1 for Verbose. In the last window select option Yes to Save changes.

Overall this is my customized prompt setup. If you want to make some changes or modify your current prompt just type:

p10k configure

🔌 Add Plugins

# 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

In ~/.zshrc, update your plugin list:

plugins=(git zsh-autosuggestions zsh-syntax-highlighting)

5️⃣ Better History Search (Up/Down Arrow Magic)

Add this to the bottom of your ~/.zshrc:

autoload -Uz up-line-or-search
autoload -Uz down-line-or-search
zle -N up-line-or-search
zle -N down-line-or-search
bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

This allows intuitive history searching as you type using the ↑ and ↓ arrows — much faster than hitting Up endlessly.

💡 Tips: WezTerm Split Pane Shortcuts

WezTerm has built-in support for split panes, just like tmux, but with less config hassle.

Here are the default keyboard bindings to manage panes:

ActionKey Binding
Split horizontalCTRL+SHIFT+"
Split verticalCTRL+SHIFT+%
Move to next paneCTRL+SHIFT+→/←/↑/↓
Close current paneCTRL+SHIFT+W
Open new tabCTRL+SHIFT+T
Move to next tabCTRL+SHIFT+→
Move to previous tabCTRL+SHIFT+←

Update your .wezterm.lau file to have a default key bindings above setup.

local wezterm = require 'wezterm'

return {
  font = wezterm.font("FiraCode Nerd Font"),
  font_size = 14.0,
  window_decorations = "RESIZE",
  window_background_opacity = 0.8,

  keys = {
    -- Split panes
    {key="%", mods="CTRL|SHIFT", action=wezterm.action{SplitHorizontal={domain="CurrentPaneDomain"}}},
    {key="\"", mods="CTRL|SHIFT", action=wezterm.action{SplitVertical={domain="CurrentPaneDomain"}}},

    -- Close pane
    {key="w", mods="CTRL|SHIFT", action=wezterm.action{CloseCurrentPane={confirm=true}}},

    -- Move between panes
    {key="LeftArrow", mods="CTRL|SHIFT", action=wezterm.action{ActivatePaneDirection="Left"}},
    {key="RightArrow", mods="CTRL|SHIFT", action=wezterm.action{ActivatePaneDirection="Right"}},
    {key="UpArrow", mods="CTRL|SHIFT", action=wezterm.action{ActivatePaneDirection="Up"}},
    {key="DownArrow", mods="CTRL|SHIFT", action=wezterm.action{ActivatePaneDirection="Down"}},

    -- Tab management
    {key="t", mods="CTRL|SHIFT", action=wezterm.action{SpawnTab="CurrentPaneDomain"}},
    {key="LeftArrow", mods="ALT", action=wezterm.action{ActivateTabRelative=-1}},
    {key="RightArrow", mods="ALT", action=wezterm.action{ActivateTabRelative=1}},
  },

  enable_tab_bar = true,
  hide_tab_bar_if_only_one_tab = false,
}

💡 You can customize all these shortcuts in your ~/.wezterm.lua config file.

These shortcuts allow you to work in multiple shell sessions without ever leaving the terminal window — great for multitasking, development, and server work. Below is the sample screenshot with split screen.

✅ Final Thoughts

Now you have an amazing terminal setup that’s:

  • Beautiful and fast (WezTerm + FiraCode)
  • Highly productive (Oh My Zsh + plugins)
  • Developer-friendly (Powerlevel10k)
  • Intuitive (up/down history search)

This setup is excellent for developers, penetration testers, DevOps engineers, and Linux system administrators. Whether you’re writing code, managing servers, or automating tasks, this terminal will make your experience smoother and more enjoyable. 🎯

Related Post

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.