[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)