Ghostty + tmux + Neovim: Full Environment Setup (Gruvbox)

Once again, after resetting my laptop, I decided to set everything up properly and keep all the configs in one place. I like the Gruvbox theme — warm, easy on the eyes, and readable at any time of day. I started there. Then I looked for a lighter terminal: I used iTerm2 before, but it got too heavy and slow to start — so I chose Ghostty.

This article covers why this stack, how to set it up, and what settings to use for a ready-made development and DevOps environment.

Ghostty with tmux and Neovim in dark theme
Ghostty with tmux and Neovim

Why This Stack

Ghostty — a fast, cross-platform terminal with native UI and GPU acceleration. Starts instantly, doesn’t use much memory, supports ligatures, themes, and low input latency. After iTerm2, the responsiveness difference is very noticeable.

tmux — terminal multiplexer: sessions, windows, and panes in one place. You can detach from a session and reattach from another device — everything stays where it was. Handy for long-running tasks, logs, and multiple projects at once.

Neovim — editor with LSP, completion, and familiar vim-style controls. Works the same locally and over SSH, which matters for a single workflow.

zsh + Oh My Zsh + Powerlevel10k — comfortable shell and informative prompt without much setup.

Together this gives one environment: one terminal, one theme (Gruvbox), one set of key bindings. Ideal for daily development and DevOps: code in Neovim, logs in a tmux pane, commands in another.

Code in dark theme — typical Neovim view
Code in dark theme

Contents


Installing Dependencies

Install Homebrew if you don’t have it:

BASH
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Click to expand and view more

Install the tools:

BASH
brew install tmux neovim git fzf bat eza node
brew install --cask ghostty font-jetbrains-mono-nerd-font
Click to expand and view more

JetBrains Mono Nerd Font is needed for prompt icons and code ligatures.


Ghostty Configuration (Gruvbox)

Config file:

PLAINTEXT
~/.config/ghostty/config
Click to expand and view more

Create the directory and file:

BASH
mkdir -p ~/.config/ghostty
nano ~/.config/ghostty/config
Click to expand and view more

Example Gruvbox config:

INI
font-family = JetBrainsMono Nerd Font
font-size = 14

window-padding-x = 6
window-padding-y = 6

background-opacity = 1.0

copy-on-select = false

scrollback-limit = 10000000

cursor-style = block

term = xterm-256color

macos-option-as-alt = true

background = #282828
foreground = #ebdbb2

cursor-color = #ebdbb2

selection-background = #3c3836
selection-foreground = #ebdbb2

palette = 0=#282828
palette = 1=#cc241d
palette = 2=#98971a
palette = 3=#d79921
palette = 4=#458588
palette = 5=#b16286
palette = 6=#689d6a
palette = 7=#a89984
palette = 8=#928374
palette = 9=#fb4934
palette = 10=#b8bb26
palette = 11=#fabd2f
palette = 12=#83a598
palette = 13=#d3869b
palette = 14=#8ec07c
palette = 15=#ebdbb2
Click to expand and view more

Restart Ghostty after saving — the theme will apply.


tmux Configuration

Config file: ~/.tmux.conf

Example settings for Ghostty and 256 colors:

CONF
set -g mouse on
set -g history-limit 200000

set -g default-terminal "screen-256color"

set -ga terminal-overrides ",xterm-256color:Tc"
set -ga terminal-overrides ",xterm-ghostty:Tc"

set -sg escape-time 0

set -g focus-events on

bind r source-file ~/.tmux.conf \; display "reloaded"
Click to expand and view more

Reload config without leaving tmux: Ctrl+b, then r.


zsh + Oh My Zsh + Powerlevel10k

Install Oh My Zsh:

BASH
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Click to expand and view more

Install Powerlevel10k theme:

BASH
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
  ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
Click to expand and view more

In ~/.zshrc set the theme:

BASH
ZSH_THEME="powerlevel10k/powerlevel10k"
Click to expand and view more

After restarting the terminal, run the prompt configurator:

BASH
p10k configure
Click to expand and view more

Neovim Setup (vim-plug, Gruvbox, LSP)

Create config:

BASH
mkdir -p ~/.config/nvim
nano ~/.config/nvim/init.vim
Click to expand and view more

Minimal example with Gruvbox, LSP, and Telescope:

VIM
set number
set relativenumber
set mouse=a
set expandtab
set tabstop=2
set shiftwidth=2
set termguicolors

let mapleader=" "

call plug#begin(stdpath('data') . '/plugged')

Plug 'morhetz/gruvbox'
Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/nvim-cmp'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-telescope/telescope.nvim'

call plug#end()

colorscheme gruvbox
Click to expand and view more

Install vim-plug:

BASH
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Click to expand and view more

Install plugins: open Neovim and run :PlugInstall, or from the terminal:

BASH
nvim +PlugInstall +qall
Click to expand and view more

LSP Configuration (Neovim 0.11+)

Add this block to the same init.vim for LSP (TypeScript and Python):

VIM
lua << EOF
local capabilities = require("cmp_nvim_lsp").default_capabilities()

vim.lsp.config("ts_ls", {
  capabilities = capabilities,
})

vim.lsp.config("pyright", {
  capabilities = capabilities,
})

vim.lsp.enable({
  "ts_ls",
  "pyright",
})
EOF
Click to expand and view more

Install LSP servers globally (or via Mason, etc.):

BASH
npm install -g typescript typescript-language-server
npm install -g pyright
Click to expand and view more

Plugins and extensions: where and why

In this stack, plugins are used in zsh (Oh My Zsh + themes) and Neovim. Ghostty and tmux use config only, with no separate plugin system.

zsh: Oh My Zsh and Powerlevel10k

WhatWhere usedWhy
Oh My Zshzsh shellFramework: easy config, plugin/theme catalog, auto-updates.
Powerlevel10kOh My Zsh theme (ZSH_THEME)Fast, informative prompt: git status, time, path, venvs — all in one line.

The other tools from brew install (fzf, bat, eza) are standalone programs in PATH, not plugins: fzf for fuzzy file and history search, bat for syntax-highlighted terminal output, eza as a modern ls replacement.

Neovim: plugins (vim-plug)

PluginPurpose
vim-plugPlugin manager: install, update, lazy-load. Used via call plug#begin() / Plug 'repo/name' / call plug#end().
morhetz/gruvboxColor scheme. Warm colors, good readability, matches Ghostty terminal. Enable with colorscheme gruvbox.
neovim/nvim-lspconfigConfig for Neovim’s built-in LSP client. Connects language servers (ts_ls, pyright, etc.) with minimal code.
hrsh7th/nvim-cmpCompletion engine: shows a menu of suggestions (from LSP, buffer, file paths). Works with sources like cmp-nvim-lsp.
hrsh7th/cmp-nvim-lspLSP completion source for nvim-cmp. Feeds methods, variables, arguments from the language server.
nvim-lua/plenary.nvimLua library for plugins: async helpers, utilities. Required by Telescope and many other plugins.
nvim-telescope/telescope.nvimFuzzy finder: files, text in project, buffers. In this article bound to Space+f (files) and Space+g (text search).

Summary: vim-plug installs and loads plugins, gruvbox provides the theme, nvim-lspconfig wires up LSP, nvim-cmp and cmp-nvim-lsp handle LSP completion, plenary.nvim is a dependency, telescope.nvim is for quick file and text navigation.


Hotkey cheatsheet

A full reference for daily use with Ghostty + tmux + Neovim.

Ghostty

Windows and tabs

ActionKeys
New windowCmd+N
New tabCmd+T
Close tabCmd+W
Next tabCmd+Shift+]
Previous tabCmd+Shift+[
FullscreenCmd+Ctrl+F

Move window (when titlebar is hidden): Cmd + drag with mouse.

Copy / paste: Cmd+C / Cmd+V.

tmux

Prefix: Ctrl+b

Sessions

ActionCommand / shortcut
Create sessiontmux new -s dev
List sessionstmux ls
Attachtmux attach -t dev
DetachCtrl+b d
Kill sessiontmux kill-session -t dev

Windows

ActionKeys
New windowCtrl+b c
Next windowCtrl+b n
Previous windowCtrl+b p
List windowsCtrl+b w
Close windowCtrl+b &

Split panes

ActionKeys
Vertical splitCtrl+b %
Horizontal splitCtrl+b "
Switch panesCtrl+b + arrow keys

Resize panes: Ctrl+b Ctrl+←/→/↑/↓

Copy mode: enter — Ctrl+b [, select — Space, copy — Enter, paste — Ctrl+b ].

Neovim

Modes: Normal — Esc, Insert — i, Visual — v, Command — :

Save and quit

ActionCommand
Save:w
Quit:q
Save and quit:wq
Quit without saving:q!

Navigation: up k, down j, left h, right l, line start 0, line end $, file start gg, file end G.

Editing: delete line dd, delete word dw, undo u, redo Ctrl+r, yank line yy, paste p. Delete all: ggdG.

Search: search /text, next n, previous N.

LSP: go to definition gd, hover K, references gr, rename Space+rn, code action Space+ca.

Telescope: find file Space+f, search text Space+g.

Example DevOps workflow

Create session: tmux new -s dev. Split: Ctrl+b %. Left pane: nvim ., right pane: kubectl logs -f pod/.... Detach: Ctrl+b d. Reattach: tmux attach -t dev.

Most important shortcuts

Ghostty: Cmd+T, Cmd+W, Cmd+drag.

tmux: Ctrl+b c, Ctrl+b %, Ctrl+b d.

Neovim: i, Esc, :w, :q, dd, gg, G, gd, K.


Typical DevOps Workflow

One Ghostty terminal, one tmux session, several panes:

PLAINTEXT
Ghostty
 └── tmux (session dev)
      ├── Neovim — code
      ├── kubectl logs / tail
      ├── terraform / ansible
      └── shell
Click to expand and view more

This keeps the editor, logs, and commands in one place, and you can detach and reattach when needed.


Summary

The stack is ready to use:

If you want more detail on any of the configs or to adapt them, say so in the comments — we can spin that into separate posts.

Start searching

Enter keywords to search articles

↑↓
ESC
⌘K Shortcut