Skip to main content
ansicode
Terminal

tmux — ANSI escape code support

tmux is a terminal multiplexer — a layer that runs between your shell and the real terminal emulator, so a single window can host many independent panes and a detached session survives the window closing. It was first released by Nicholas Marriott in 2007 as a BSD-licensed replacement for GNU screen, and in 2026 it ships pre-built on every major Linux distro, in Homebrew, and as part of FreeBSD's base system.

For ANSI escape codes the multiplexer position matters: tmux owns its own terminal emulator (the inner one your apps talk to) and forwards a re-encoded sequence stream up to the outer terminal that's rendering the window. Most escapes pass through cleanly (every SGR colour code, cursor motion, erase) but a handful are intercepted by tmux itself — alt-screen, mouse, focus events, OSC 8 hyperlinks — and a few never make it (the Kitty graphics protocol fights tmux's character-grid model and corrupts under it). The #1 friction point everyone hits first is truecolor: tmux requires both `set -g default-terminal "tmux-256color"` and `set -ga terminal-overrides ",*256col*:Tc"` (or `,*:RGB`) in `~/.tmux.conf` before 24-bit SGR is forwarded; without the override `\x1b[38;2;255;0;0m` gets silently quantised to the nearest 256-palette index.

Last updated

Feature support

How this terminal scores against the 15 features tracked in the site-wide support matrix. Click any feature name to see the full row across every terminal.

  • 8 basic colors (30–37 / 40–47)SGR 30–37 foreground, 40–47 background.
    yes
  • Bright (aixterm) colors (90–97 / 100–107)aixterm SGR extension.
    yes
  • 256-color palette (38;5;n / 48;5;n)xterm 256-color extension.
    yes
  • 24-bit truecolor (38;2;r;g;b)16.7M direct RGB. Set $COLORTERM=truecolor.
    partial
  • Italic (SGR 3)Italic text attribute.
    yes
  • Styled underlines (4:1–4:5)Curly/dotted/dashed underline styles.
    partial
  • Strikethrough (SGR 9)Horizontal line through text.
    yes
  • OSC 8 hyperlinksInline clickable URIs.
    partial
  • Alt screen (?1049h)Full-screen app buffer.
    yes
  • Mouse tracking (SGR ?1006)Mouse click/drag events.
    partial
  • Bracketed paste (?2004)Pasted text wrapped in ESC[200~/ESC[201~.
    yes
  • Focus events (?1004)ESC[I on focus in, ESC[O on focus out.
    partial
  • Sixel graphicsDEC sixel inline raster images.
    partial
  • Kitty graphics protocolPNG/RGB inline images, animations.
    no
  • Synchronized output (?2026)Atomic frame updates to avoid tearing.
    partial

Sequences that work here

Canonical reference pages for the escape sequences this terminal handles cleanly. Each links to a full page with byte forms, citations, and per-language examples.

Quirks & version notes

Per-terminal caveats you'll want to know before relying on a sequence in production.

Truecolor needs explicit terminal-overrides — the #1 friction point
tmux gates 24-bit SGR forwarding on whether the outer terminal's terminfo entry advertises the `Tc` (or `RGB`) capability. Most distros' default `xterm-256color` entry doesn't — so tmux quantises `\x1b[38;2;…m` to the nearest 256-palette index. The fix is two lines in `~/.tmux.conf`: `set -g default-terminal "tmux-256color"` (sets `$TERM` *inside* the multiplexer, separate from the outer `$TERM`) and `set -ga terminal-overrides ",*256col*:Tc"` (adds the `Tc` capability for any terminfo entry matching `*256col*`). After reloading (`tmux source ~/.tmux.conf`) verify with `tmux info | grep -E '(Tc|RGB)'` — both should be flagged true. The newer `,*:RGB` form (tmux ≥ 2.7) is preferred for new configs since `RGB` is the standards-track capability while `Tc` was a tmux-private extension.
OSC 8 hyperlink passthrough — only since tmux 3.4 (April 2024)
tmux 3.4 was the release that finally re-emits `\x1b]8;;https://…\x1b\\` to the outer terminal. Earlier versions stripped the OSC bytes and kept only the visible text — clickable links worked outside tmux but degraded to plain text inside. Verify your tmux supports passthrough with `tmux -V` (need ≥ 3.4) and `echo -e '\x1b]8;;https://example.com\x1b\\link\x1b]8;;\x1b\\'` while attached. If the outer terminal also supports OSC 8 (iTerm2, kitty, Ghostty, GNOME Terminal, Konsole, WezTerm — see the matrix above), the link is clickable; if not, you still see the visible text. Older tmux releases (3.0–3.3) require `set -g allow-passthrough on` to even attempt forwarding, and even then strip OSC 8 specifically.
Alt-screen, mouse, focus events — tmux owns these, not the outer terminal
Inside tmux, alt-screen toggles (`\x1b[?1049h` / `?1049l`) flip tmux's own buffer, not the outer terminal's — this is how vim/htop/less stay confined to a pane. Mouse-tracking sequences (`\x1b[?1000h`, `?1006h`) are intercepted: enable them inside tmux with `set -g mouse on`, after which tmux relays click coordinates to the focused pane's application *if* `set -g mode-mouse on` is also set. Focus events (`\x1b[?1004h`) are off by default — turn on with `set -g focus-events on` so editors like neovim can react to focus loss. The relevant pattern: applications still send the DEC private-mode sequences they always did; tmux is just the consumer in the middle.
Kitty graphics protocol breaks under tmux
tmux's character-grid model assumes every output byte updates a single cell; the Kitty graphics protocol (and Ghostty's compatible implementation) sends multi-kilobyte APC sequences that include base64 PNG/RGB data — none of which fits the grid. The famous "tmux destroys kitty graphics" issue (kovidgoyal/kitty#3027) tracks the upstream conversation; the practical answer in 2026 is: don't render Kitty graphics inside tmux, use the bare terminal. tmux 3.3+ has experimental `allow-passthrough on` that lets the APC bytes through, but the pane redraw cycle still corrupts the image. For inline images that need to survive tmux, prefer sixel — it round-trips through tmux 3.4+ behind `allow-passthrough on` (still with visual quirks, but the data isn't lost).
$TERM inside tmux is `tmux-256color`, not the outer terminal's value
When tmux launches a shell in a pane, it sets `$TERM` to `tmux-256color` (or whatever `default-terminal` is configured to). The outer terminal's `$TERM` — `xterm-256color`, `iterm2`, etc. — is not visible to the inner program. This matters for terminfo-based feature detection: `tput colors` reports 256 inside tmux even if the outer terminal supports truecolor; the application has to trust `$COLORTERM=truecolor` (which tmux *does* forward from the outer environment) or check `tmux info | grep RGB` programmatically. Old tmux releases set `$TERM=screen-256color`, which is the canonical multiplexer terminfo entry but lacks italic and a few other capabilities — bump to `tmux-256color` (ships in ncurses ≥ 6.0) for fewer surprises.
Sequences that vanish: bracketed-paste, DA1/DA2 responses, palette queries
tmux re-encodes the input stream from the outer terminal before forwarding it to panes — most byte sequences survive, but a few are answered or absorbed by tmux directly. Device Attributes responses (`\x1b[?1;2c` after a `CSI c` query) come from tmux, not the outer terminal — apps that probe via DA1 to detect sixel see tmux's capabilities, not what's underneath. Palette queries (`OSC 4 ; n ; ? \x07`) are similarly answered by tmux's own palette (typically the 256-colour xterm palette), not the outer terminal's themed palette. Bracketed-paste input wrapping (`\x1b[200~ … \x1b[201~`) is forwarded — tmux 2.6+ also implements it natively so pasting works correctly even into panes whose apps didn't enable the mode.

Citations

Other terminals with landing pages