by teddyh 11 hours ago

No mention whatsoever of the $TERM environment variable. sigh

Outputting raw escape codes and hope that they work is not how you do it. This is not how any reasonable library (or bash, or git, etc.) does it. These programs and libraries start with the $TERM environment variable to find out what terminal the user is using, and then use something like termcap(5) or terminfo(5) to look up what capabilities that specific terminal has, and what actual escape codes to output to get that effect. In reality, though, most regular programs delegate all this to a library, like ncurses.

(And also make sure not to output any terminal codes at all if the standard output is not a terminal, as in isatty(3) or tty(1).)

This way, you can check for and use modern cool stuff like sixels, but not use them if some user is using something older like XTerm or the Windows Console.

tripflag 10 hours ago | [-2 more]

Aside from the 256-color section, I believe all of the examples given in the article are basic sequences which are supported in ~every terminal. Are you aware of any notable terminals where that is not the case?

Maybe I've been lucky, but I've written plenty software that blindly shoots CSI's at the console and still haven't hit any snags. Especially convenient when the channel is unidirectional; curl ocv.me :)

foresto 41 minutes ago | [-0 more]

I have read that people still use 9term. Its terminfo entry doesn't show any sign of ANSI escape code support.

If I remember correctly, ANSI-like terminal emulators in RGB mode (aka direct mode) only support 16-color and red/green/blue escape codes. Not the 256-color palette used in this article.

ANSI-compatible terminal emulators widely disagree on whether RGB values should be separated by semicolons or colons.

I have read articles (possibly on hackaday) this decade by people working on retro hardware projects, expressing frustration with command line programs that spew ANSI garbage to their non-ANSI terminals. At least one author resorted to the screen program, because it can translate some ANSI-isms to the correct codes for the active terminal.

I had genuine TeleVideo 912 glass terminals hooked up until not terribly long ago.

In any case, I don't view this as a matter of whether unusual terminals are "notable". We have an abstraction that plays nicely with them (and allows new terminal protocols to be developed). It's a POSIX standard. It's easy to use. I suggest using it.

(I'll put examples in a separate comment.)

skydhash 9 hours ago | [-0 more]

Shelll-mode in emacs uses $TERM=dumb and doesn’t support escapes code by default. Same with compile-mode. Also there’s some tools that persist using escapes code even when piped to another program (like less).

matheusmoreira 8 hours ago | [-0 more]

Everything is either xterm or something else that's emulating most if not all of its features. Whatever isn't is probably terrible and broken and not worth supporting unless you're getting paid fat stacks to do it.

shawn_w 10 hours ago | [-0 more]
foresto 38 minutes ago | [-0 more]

For those who don't know how to properly get the active terminal's color escape codes...

green=$(tput setaf 2)

normal=$(tput sgr0)

echo ${green}Color${normal} text.

...or if you plan to run on non-POSIX systems that lack tput...

green=$(tput setaf 2 2>/dev/null || true)

xyzzy_plugh 11 hours ago | [-1 more]

Indeed, but also termcap is a tire fire. I like the way Ghostty deals with it: https://ghostty.org/docs/help/terminfo

Even then it still leaves a lot to be desired. I'm not sure I can consider any of this to be truly reasonable.

matheusmoreira 8 hours ago | [-0 more]
enriquto 11 hours ago | [-0 more]

> No mention whatsoever of the $TERM environment variable. sigh

I have mixed feelings about this... Sometimes I feel young and reckless and want to just output whatever I need without checking $TERM. In practice, all modern terminal emulators are essentially xterm-256color compatible. If something breaks, the worse you get is some funny characters. Is that such a big deal? Much better than propagate the silly termcap/terminfo complexity.

By the way, xterm supports sixels since forever.