Synchronized output is merely implementing the feature as inspired by iTerm2 synchronized output,
except that it's not using the rare DCS but rather the well known SM ?
and RM ?
. iTerm2 has now also adopted to use the new syntax instead of using DCS.
When rendering the screen of the terminal, the Emulator usually iterates through each visible grid cell and renders its current state. With applications updating the screen a at higher frequency this can cause tearing.
This mode attempts to mitigate that.
When the synchronization mode is enabled following render calls will keep rendering the last rendered state. The terminal Emulator keeps processing incoming text and sequences. When the synchronized update mode is disabled again the renderer may fetch the latest screen buffer state again, effectively avoiding the tearing effect by unintentionally rendering in the middle a of an application screen update.
Use CSI ? 2026 $ p
to query the state of the (DEC) mode 2026
. This works for any private mode number.
If you get nothing back (DECRQM not implemented at all) or you get back a CSI ? 2026 ; 0 $ y
then synchronized output is not supported.
See DECRQM (request)
and DECRPM (response) for more details.
DECRPM can respond with different values.
Value | Documentation | Relevance for synchronized output mode ?2026 |
---|---|---|
0 |
Mode is not recognized | not supported |
1 |
Set | supported and screen updates are not shown to the user until mode is disabled |
2 |
Reset | supported and screen updates are shown as usual (e.g. as soon as they arrive) |
3 |
Permanently set | undefined |
4 |
Permanently reset | not supported |
Use CSI ? 2026 h
to enable batching output commands into a command queue.
Use CSI ? 2026 l
when done with your current frame rendering, implicitly updating the render state by reading out the latest grid buffer state.
Some developers name the beginning and end of such a synchronized frame (and therefore the instance)
BSU
(begin synchronized update,CSI ? 2026 h
), andESU
(end synchronized update,CSI ? 2026 l
).
So far there is no real concensus if and if so how long a timeout should be. The toolkit/application implementer should keep this in mind. However, a too short timeout (maybe due to a very slow connection) won't be worse than having no synchronized output at all.
Support | Terminal/Tookit/App | Notes |
---|---|---|
n/a | xterm.js | see tracker xterm.js#3375 |
not yet | Windows Terminal | Proof-of-concept implementation by @j4james exists; tracker: wt#8331 |
✅ | Contour | |
✅ | mintty | |
✅ | Jexer | |
✅ | notcurses | see tracker: notcurses#1582 |
✅ | foot | terminal emulator https://codeberg.org/dnkl/foot |
✅ | Wezterm | see tracker: wezterm#882 |
not yet | VTE / gnome-terminal | see tracker: gitlab/vte#15 |
✅ | iTerm2 | |
✅ | Kitty | since 5768c54c5b5763e4bbb300726b8ff71b40c128f8 |
planned | Warp | see tracker: warpdotdev/Warp#2185 |
✅ | Alacritty | since 0.13.0 |
unknown | Konsole | |
unknown | urxvt | |
unknown | st |
In case some project is adding support for this feature, please leave a comment or contact me, so we can keep the spec and implementation state table up to date.
@imsnif A few apps that I know of: tmux, neovim, btop, kakoune. Also a couple of TUI frameworks: textual, crossterm.
@christianparpart You may also want to add Alacritty to the supported terminal list now. I don't think it's part of a release build yet, but it's in the current dev build (it's mentioned in the CHANGELOG).