[HN Gopher] Build your own Command Line with ANSI escape codes (...
___________________________________________________________________
Build your own Command Line with ANSI escape codes (2016)
Author : vinhnx
Score : 27 points
Date : 2026-02-28 03:48 UTC (2 days ago)
(HTM) web link (www.lihaoyi.com)
(TXT) w3m dump (www.lihaoyi.com)
| esafak wrote:
| If 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 wrote:
| Also, 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/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.
| tl2do wrote:
| I'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 wrote:
| 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.
| xyzzy_plugh wrote:
| 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.
| enriquto wrote:
| > 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 wrote:
| 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 :)
| shawn_w wrote:
| Easy way is to use `tput` to generate the color codes for your
| terminal type on the fly.
|
| See https://stackoverflow.com/questions/54838578/color-codes-
| for... for examples.
___________________________________________________________________
(page generated 2026-03-02 23:00 UTC)