6 ms·
Build your own Command Line with ANSI escape codes (2016)
- esafak 8mo agoIf you're going to do this also provide a way to disable it so parsers don't trip up on its escape-coded output.
- klibertp 8mo agoAlso, disable the formatting if stdout is not a terminal. That way, your colors and cursor movements won't be visible when piping to another program, and your tool will be usable in apps that don't understand the CSI and chars that follow. Use a command-line switch with more than two states, e.g., `ls` (and probably other GNU tools) has `--color=always|auto|never` which covers most use cases. Also not mentioned in the article: there are a few syntaxes available for specifying things in control sequences, like \x1b[38;2;{r};{g};{b}m for specifying colors. There's a nice list here: https://gist.github.com/ConnerWill/d4b6c776b509add763e17f9f113fd25b https://gist.github.com/ConnerWill/d4b6c776b509add763e17f9f1... You can also cram as many control codes as you want into a control sequence, though it probably isn't useful in a modern context in 99.9% of cases.
- tom_ 8mo agoAlso good for people that have a light coloured terminal background.
- tl2do 8mo agoI've been programming for 20 years and apparently still don't understand what my terminal is doing. Recently I asked Claude Code to generate a small shell script. It came back full of escape codes and I just stared at it like a caveman looking at a smartphone. This article finally explains what's been happening right under my nose.
- teddyh 8mo agoNo 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.
- xyzzy_plugh 8mo agoIndeed, but also termcap is a tire fire. I like the way Ghostty deals with it: https://ghostty.org/docs/help/terminfo 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 8mo agoKitty does this as well. Looks like every terminal ships with their own terminfo nowadays. Apparently this is to work around the ncurses maintainer. https://github.com/kovidgoyal/kitty/issues/2773 https://github.com/kovidgoyal/kitty/issues/2773 https://github.com/kovidgoyal/kitty/issues/879 https://github.com/kovidgoyal/kitty/issues/879 https://lists.gnu.org/archive/html/bug-ncurses/2018-09/msg00007.html https://lists.gnu.org/archive/html/bug-ncurses/2018-09/msg00...
- enriquto 8mo ago> 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.
- tripflag 8mo agoAside 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 :)
- skydhash 8mo agoShelll-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).
- bitwize 8mo agoEverybody who matters is using Ghostty nowadays! Why bother having the God-damned common decency to call isatty(), let alone use terminfo to look up the actual escape codes used by the user's terminal as reported by $TERM?
- mjbonanno 8mo agoThis is cool. I am playing around with Bubble Tea in Go today.