🚀 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
andzsh-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:
Action | Key Binding |
---|---|
Split horizontal | CTRL+SHIFT+" |
Split vertical | CTRL+SHIFT+% |
Move to next pane | CTRL+SHIFT+→/←/↑/↓ |
Close current pane | CTRL+SHIFT+W |
Open new tab | CTRL+SHIFT+T |
Move to next tab | CTRL+SHIFT+→ |
Move to previous tab | CTRL+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. 🎯