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 Aug 23, 2025 at 9:06AM

Reading Time: 6 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

# Fedora/Rocky/Alma Linux
sudo dnf update
sudo dnf install -y curl

# Look for GitHub Repository for your current distribution
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

Copy and paste the script below, then set FiraCode Nerd Font as your 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|TITLE",
  window_background_opacity = 0.8,
  enable_tab_bar = true,
  hide_tab_bar_if_only_one_tab = true,
  adjust_window_size_when_changing_font_size = false,
  force_reverse_video_cursor = true,
}

3️⃣ Install Oh My Zsh

# Debian/Ubuntu Linux
sudo apt install -y zsh git curl

# Fedora/Rocky/Alma Linux
sudo dnf install -y zsh git curl

# Set default shell to zsh and verify
sudo usermod -s /usr/bin/zsh $USER && grep $USER /etc/passwd

# Install Oh My Zsh
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.

-- Safe config with error handling
local ok, wezterm = pcall(require, 'wezterm')
if not ok then
  error("Failed to load wezterm module: " .. tostring(wezterm))
end

-- Function to format tab title with fixed width
local function tab_title(tab_info)
  local title = tab_info.tab_title
  -- If no explicit title, use the current pane title
  if title and #title > 0 then
    title = title
  else
    title = tab_info.active_pane.title
  end
  
  -- Fixed width of 30 characters (adjust as needed)
  local fixed_width = 30
  
  if #title > fixed_width then
    -- Truncate and add ellipsis
    title = string.sub(title, 1, fixed_width - 3) .. "..."
  else
    -- Pad with spaces to reach fixed width
    title = title .. string.rep(" ", fixed_width - #title)
  end
  
  return title
end

wezterm.on('format-tab-title', function(tab, tabs, panes, config, hover, max_width)
  return tab_title(tab)
end)

return {
  font = wezterm.font("FiraCode Nerd Font"),
  font_size = 12.0,
  window_decorations = "RESIZE|TITLE",
  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,
  adjust_window_size_when_changing_font_size = false,
  force_reverse_video_cursor = true,

  -- Tab bar customization
  use_fancy_tab_bar = true, -- Use tab with close button
  tab_bar_at_bottom = true,
}

💡 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.

(Optional) Fine Tune your VSCODE Editor

When you first launch Visual Studio Code, the display will appear as shown below since FiraCode Nerd Font is not yet configured in the editor.

To adjust the font in VS Code terminal, you can modify the terminal font settings through VS Code’s settings. Here are the main ways to do this:

Through settings.json
1. Open Command Palette (Ctrl+Shift+P)
2. Type “Preferences: Open User Settings (JSON)”
3. Add these settings and save.

{
    "terminal.integrated.fontFamily": "FiraCode Nerd Font", 
    "terminal.integrated.fontSize": 14,
    "terminal.integrated.fontWeight": "normal",
    "terminal.integrated.fontWeightBold": "bold"
}

Popular Monospace Fonts for Terminal
Fira Code – Popular with ligatures
JetBrains Mono – Good readability
Source Code Pro – Clean and readable
Consolas (Windows)
Monaco (Mac)
Ubuntu Mono (Linux)

✅ 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. 🎯

Calendar

September 2025
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930  

Related Post