Neovim + tmux Integration:
Seamless Navigation, True Color & Clipboard
Combining Neovim with tmux creates the gold standard in terminal productivity. This guide walks through eliminating modal switching lag, unified Ctrl+h/j/k/l split navigation, 24-bit True Color rendering, and OSC 52 system clipboard sharing.
1. Seamless Pane & Split Navigation (vim-tmux-navigator)
Normally, moving between Neovim splits requires Ctrl+w h/j/k/l, while moving between tmux panes requires Ctrl+b <arrow>. With vim-tmux-navigator, you can use Ctrl+h/j/k/l across both seamlessly without pressing any prefix key.
Step 1: Install in Neovim (Lazy.nvim)
-- Lazy.nvim plugin specification
return {
'christoomey/vim-tmux-navigator',
cmd = {
'TmuxNavigateLeft', 'TmuxNavigateDown',
'TmuxNavigateUp', 'TmuxNavigateRight',
},
keys = {
{ '<c-h>', '<cmd>TmuxNavigateLeft<cr>' },
{ '<c-j>', '<cmd>TmuxNavigateDown<cr>' },
{ '<c-k>', '<cmd>TmuxNavigateUp<cr>' },
{ '<c-l>', '<cmd>TmuxNavigateRight<cr>' },
},
}
Step 2: Add Smart Navigator Hook to ~/.tmux.conf
2. Eliminate Escape Key Delay
By default, tmux introduces a 500ms pause after pressing Esc to see if it belongs to an escape sequence. In Neovim, this creates noticeable lag when exiting Insert Mode to Normal Mode.
Add this line to the very top of your ~/.tmux.conf:
set -s escape-time 0
Modal transitions in Neovim will now feel instantaneous.
3. 24-Bit True Color & Undercurls
To ensure modern Neovim color schemes (such as Catppuccin, Tokyo Night, Gruvbox) render with rich 24-bit RGB truecolor inside tmux, add the following terminal overrides:
# Set correct default terminfo
set -g default-terminal "tmux-256color"
# Enable RGB 24-bit color support
set -ag terminal-overrides ",xterm-256color:RGB"
set -ag terminal-overrides ",alacritty:RGB"
set -ag terminal-overrides ",xterm-ghostty:RGB"
Pair this with our terminal emulator guides for Ghostty and iTerm2.
4. System Clipboard & Focus Events
Two essential quality-of-life settings ensure files automatically refresh when changed outside Neovim (e.g. by git pull or linters) and ensure clipboard sharing works over SSH:
# Enable focus events so Neovim autoread works seamlessly
set -g focus-events on
# Enable OSC 52 system clipboard copying across SSH
set -s set-clipboard on
In your Neovim init.lua, enable system clipboard synchronization:
vim.opt.clipboard = "unnamedplus"