[HN Gopher] Colorize Your CLI ___________________________________________________________________ Colorize Your CLI Author : danyspin97 Score : 147 points Date : 2020-07-26 14:34 UTC (8 hours ago) (HTM) web link (danyspin97.org) (TXT) w3m dump (danyspin97.org) | Tade0 wrote: | Somewhat related: | | My friend is developing a colour palette based on Solarized: | | https://github.com/jan-warchol/selenized | | but with more perceptual uniformity. | samsaga2 wrote: | As developer I think we use too many colors everywhere. It is | really necessary? Some terminals looks like a rainbow festival. | | A color for the user, a different color for the hostname, another | one for the git branch... It is a directory? Let's add a new | color. I think is too much. | | I like to use themes like minimal-theme | [https://github.com/anler/minimal-theme]. My eyes appreciate it. | sgt wrote: | I agree. How about just reading the text? The human brain is | excellent at quickly skimming through text and recognizing | patterns. We don't need colors. | CapsAdmin wrote: | Sounds like the problem is not colors, but the amount of stuff | we're differentiating then. You could say the same thing about | making things bold, italics, shades of grey, etc. | | I would think people recognize different colors better than | shades of grey or bold text though. | | Interestingly, in a lot of Japanese advertisement it feels like | all the ways of making something stand out have been exhausted. | [deleted] | GhostVII wrote: | I feel like we need a complete rewrite of terminal | emulators/bash/whatever. It should be super easy to make a CLI | with nice colors, good loading icons, etc. without having to deal | with all kinds of color codes and cursor movement. When I press | "enter" while a script is showing some progress bar, or resize | the terminal window, it should handle it nicely like every other | application. | | I use the command line whenever possible over a GUI application, | but sometimes I wish it wasn't still stuck in the 80s. Keep the | speed an simplicity (I don't want images or anything), but make | it easy to make robust applications with a clean text based UI. I | shouldn't still have ghosting in my Vim setup, it's 2020. | IshKebab wrote: | I agree. Nushell (https://github.com/nushell/nushell) is the | best I have seen so far. It still lives in a standard terminal | from the 80s - basically no graphics, limited mouse support, | etc. But I guess you can't change everything at once. It's an | enormous improvement on Bash at least! | clon wrote: | I am not looking forward to using a new improved shell written | in JS. | vkou wrote: | I rarely look forward to using the old, crufty shell, but I'm | a madman who would like things like arrow keys and backspace | and maybe even box select to actually work in a sane manner. | | I don't need spreadsheets and rich markup in my terminal. I | just want basic HCI to work - consistently. | theshetty wrote: | I can't agree more!!! | | I wrote this simple SAS program/job scheduler | (https://github.com/PrajwalSD/runSAS) using just bash script | (with few utils) intentionally to allow for maximum adoption in | projects and just made it more more colorful. In short 75% of | the code in there is just handling the terminal (keys, scroll, | progress bar etc.) and 25% is the actual load balancing logic. | nurpax wrote: | Inline images would be great too (bitmap or svg). There'd be a | lot less need for something like jupyter if you could show | images in the shell. | thih9 wrote: | > I feel like we need a complete rewrite of terminal | emulators/bash/whatever. | | A complete rewrite would be an opportunity to overlook | important ideas, compromise on goals and make design mistakes. | | I'd strongly prefer slow, iterative approach here. | kjeetgill wrote: | To use a tortured metaphor: Like any pathfinding problem, | sure slow and iterative is an important part of the algorithm | but so is backtracking. | | I'm inclined to "if it ain't broke don't fix it", but it's | also just as true that this greedy algorithm just leaves us | at a local optima. | rozab wrote: | I've spent a lot of time messing with terminal UIs, and I feel | that the experience could be improved hugely just by adding a | couple new escape sequences, for right aligned text and for | filling to the rest of the width of the terminal with a | character. Thanks to terminfo this shouldn't affect backwards | compatibility. | | I certainly don't think a full rewrite is necessary (we managed | to tack on mouse support and even image rendering[0] no | problem). Curses is a pain to work with directly, but this is | not the fault of terminals or shells. It's really easy to | create curses interfaces with libraries like blessings[1]. | | [0]: http://blog.z3bra.org/2014/01/images-in-terminal.html | | [1]: https://github.com/erikrose/blessings | enriquto wrote: | Oh, please, no "color codes". | | Some of us prefer a monochrome terminal, with the only | distinction being bright/bold and regular text. I'm all for | modernizing the classical unix tools, but turning them into | kitsch Christmas trees is maybe not the best way. | mulmen wrote: | I kinda like using tooling with 40 years of refinement. Is it | perfect? No. Do I need to resize a window with a progress bar? | No. Would it be nice? Yeah, I guess. Am I underestimating the | benefits? Almost certainly. | | But what are the other sharp edges that come with the shiny new | thing? Would it be an electron app? Yes, probably. Would it | work? Maybe, in a couple years. There would be some major bugs | first, and a lot of dead batteries. | | I don't think new devs are specifically worse than old ones. I | do think there is immense value in using something that has | been actively improved for your (well, at least my) entire | lifetime. | | There are lessons buried in there we don't even begin to | understand. Starting over means forgetting those lessons too. | | The grass is always greener on the other side of the fence is | what I am saying. | michaelmure wrote: | It looks to me that the reality is closer to "40 years of | hack over something that was not meant to be a standard (a | popular hardware terminal from the 80s)". | | I'll give you just one example of the madness that is | sometimes required: the escape code \e[1m is doing "bold on". | It's counterpart to reset \e[21m, is supposed to do "bold | off", but in practice some terminals do "double underline" | instead because this standard is not a real standard. As | there is also no real way to detect capability, the only | reliable way to do "bold off" that I could find is to | intercept the stream of data sent to the terminal to compute | the attribute state. When you want to do a "bold off" you do | a \e[0m "reset all" instead and sent the control character to | set the state again without bold [1]. | | A new standard would also allow to reliably use features like | displaying images or links. | | [1] https://github.com/MichaelMure/go-term- | markdown/blob/master/... | IncRnd wrote: | Not using bold properly means the terminal was written | incorrectly, or the wrong termcap is being used to emulate | a different terminal. | | This isn't a bug with escape codes or with terminals that | work. It is either that someone doesn't know which teminal | they are using, or there is a bug in that specific | terminal. | spijdar wrote: | So, what you're saying is, since there are too many | competing and incompatible standards, what we need is | another incompatible standard? :) | | There are a lot of "better" terminal emulator standards out | there. The problem is you need software that uses them. | Perhaps this is the real "refinement" spoken of before -- | these quirks are generally understood and software layers | are built on top of them to abstract away the ugliness | while keeping broad compatibility. | | There are lots of ideas on how to make a better CLI -- from | Plan9's rio/window to various XML/DOM based terminal | emulator, to a smorgasbord of xterm-but-added-features | emulators that add support for anything from inline images | to transmitting entire files over the TTY. Ultimately, | these are only as useful as the software that uses them, | which often ends up being just a few tools the terminal | emulator itself ships with. | | Even Windows' alternative to TTYs has basically been | supplanted by an xterm/VT-ish compatible TTY style | interface for software compatibility reasons. | thih9 wrote: | I'd say all this is a feature. | | This means that it's difficult to write a flashy app with | bold text, links and images. | | I like programs with minimal text ui, so I don't mind. | michaelmure wrote: | A new standard would also make it easier to fallback to | no colors/decoration if the user wish so. At the moment, | there is no way to do that without a flags or similar for | each app. Even detecting if the terminal support colors | is a pain. | thih9 wrote: | > fallback to no colors/decoration if the user wish so | | Fallbacks are frequently not implemented, not tested or | not supported as well as the main feature. | | > Even detecting if the terminal support colors is a | pain. | | As the end user, I don't mind. This means that I'll see | colors only when it's important. | cuddlecake wrote: | There are a lot of "Maybe"s in your second paragraph. | | I'd say, yes, there are a lot of lessons buried in old code, | but often, there is an equal amount of baggage we are too | fearful to abandon because of backward compatibility and "bug | became feature"-situations. | | And even then, it's not you who is abandoning that, which | makes the attitude even more baffling to me. | craftkiller wrote: | There still some pretty glaring issues, even after 40 years | of refinement. Some I think could be iteratively fixed but | not all of them (for example I believe #1 requires a | significant breaking change to terminals). | | 1. You can't have an interactive program in a pipeline. For | example, you can't do `gpg --decrypt foo.txt.gpg | nano | gpg | --encrypt` because keyboard input on the console is handled | through stdin. You can work around this by using a graphical | editor in the pipeline, but this should be possible entirely | over the command line. | | 2. You can't have hotkeys that are just modifier keys because | the modifier keys only change the byte sent when pressing | another key. So could couldn't have a hotkey "Shift" but you | can have a hotkey "Shift-n". | | 3. How do you tell the difference between an escape sequence | and the escape key? Escape sequences start with exactly the | same byte used by the escape key | | 4. While we have escape sequences to move the cursor and | detect the cursor location, in order to find dimensions of | the terminal we have to resort to an ioctl. | | 5. Termcap. Because we can't assume some standard set of | terminal features, and since my FreeBSD servers don't have a | termcap file for alacritty, when I ssh into my FreeBSD | servers my backspace key doesn't work (along with a lot of | other things). | | 6. This ones a bit optional, but it would be nice to have a | standard protocol for telling the terminal to render an | image. | | 7. Abruptly killing a program that has put the terminal into | raw mode leaves your terminal in raw mode. | | What would I do to fix this: | | 1. Move keyboard input to a different file handle than pipes. | This would require software to be patched, or at least a | compatibility layer written to merge the pipes for legacy | software. | | 2. Remap all the keyboard bytes. Every key press and every | key up sends data to the keyboard input stream. Let the | program maintain a keyup/keydown state map for handling | modifier keys. This would require software to be patched or | at least a compatibility layer written to remap the bytes. | | 3. As part of the new encoding for #2, we should make a | better encoding for input. The current system seems a lot | more "grown" than designed. I'd love to see something similar | to UTF-8 where we get to encode a variable-length integer | with the benefits of indicating byte length in the first byte | and being able to detect if we're in a continuation byte. We | could even use UTF-8 verbatim for most of the keyboard input | but we'd need a special section for escape sequences like | moving the cursor. I don't know enough about unicode to know | if theres a section we could use for that, but worst case | scenario we could use the 5 and 6-byte length utf-8 sequences | that never made it to the final utf-8 spec despite being | possible in the encoding. | | 4. As part of #3, add escape sequences to detect terminal | dimensions. | | 5. Establish a new minimum set of features that are assumed | to work, incorporating all these refinements over the past 40 | years. | | 6. This could be part of the new encoding for #3 | | 7. Automatically revert terminal to its original non-raw-mode | state at the end of a program. | | Finally, I'd recommend this blog post to appreciate how much | of a mess terminal programming is: https://viewsourcecode.org | /snaptoken/kilo/02.enteringRawMode... | eitau_1 wrote: | Here's a proposal to fix #2 and #3: | http://www.leonerd.org.uk/hacks/fixterms/ | jclulow wrote: | With respect to interactive programs in a pipeline, this | can already work today if the software is written to allow | it. While it is common for interactive software to use the | standard descriptors for I/O they are not required to. You | can instead open the magic device, /dev/tty, which gets you | new handles to the controlling terminal for the process. | a1369209993 wrote: | > For example, you can't do `gpg --decrypt foo.txt.gpg | | nano | gpg --encrypt` because keyboard input on the console | is handled through stdin. | | I actually had a alias at one point that did something | along the lines of (IIRC): | editor | -> | | editor -i /dev/fd/3 -o /dev/fd/4 3<&0 4>&1 0<&2 1>&2 | | | Since stderr (aka &2 aka /dev/pts/whatever) is opened read- | write, you can dup it onto stdin to recover the terminal. | Ideally, every editor should just support reading from | stdin, interacting via stderr[0], and writing to stdout as | a command line option though. | | Edit: 0: or /dev/tty as jclulow suggested. | vkou wrote: | > I kinda like using tooling with 40 years of refinement | | I would not call the modern terminal the result of 40 years | of refinement - mostly for the reasons outlined by the parent | poster, as well as those of the sibling posters. | | If you look at the modern terminal through fresh eyes, 'buggy | and inconsistent and clunky' would be how the average homo | sapiens would describe it. | | Just because there are reasons for why all of these warts are | in place, doesn't mean that the program is not defective, as | designed. | eitau_1 wrote: | I treated myself a deep dive into how CLIs work some time ago | and features like: | | * marking output from stderr different color (and don't | interfere with commands's own formatting much); | | * passing more involved keyboard shortcuts to the shell or a | tui program, etc.; | | * making last line of last command usable in next command or | putting it to clipboard without mouse; | | * general awareness of shell/terminal emulator of what's | displayed (prompt, edited line, commands printing in parallel, | stdout vs stderr, messages of shell (jobs)) | | are very tricky to achieve without reorganizing the whole stack | of terminal emulator, shell, line discipline/readline and even | kernel. | | [0] http://www.linusakesson.net/programming/tty/index.php | | [1] | https://utcc.utoronto.ca/~cks/space/blog/unix/TTYLineDiscipl... | | [2] https://github.com/sickill/stderred | | [3] http://www.leonerd.org.uk/hacks/fixterms | | [4] https://domterm.org/Wire-byte-protocol.html | monokh wrote: | Really tempted to install starship but I also do a bunch of | sensitive stuff with my terminal. Should I be worried about using | this? I understand it's open source, yet still not confident. | matchai wrote: | Starship maintainer here. I'm happy to answer any questions | have about how it works. | | Every render of the prompt is fully stateless. Starship has no | tracking, telemetry, and never calls home. :) | danyspin97 wrote: | Keep in mind that having bash history is already a treat since | `~/.bash_history` is readable by every program you run. | | If you want to be 100% safe you could just monitor the process | and see if it opens any internet connection but I am confident | it is just a local program. | AlexDragusin wrote: | For Windows, one could use this small color utility I've made | last year, ColorThis | | https://www.alexdragusin.com/#ColorThis | ausjke wrote: | Nice article, 'starship' is new to me, just tried out, a bit | verbose and took too much line space for me. 'highlight' should | be replaced by 'bat' these days. 'grc' is nice and I first time | learned it here. After read it and tried out, I just added 'grc' | to my tool kit(though ubuntu 18.04 misses | /etc/profile.d/grc.bashrc and I had to download it from github) | IshKebab wrote: | Also set `CLICOLOR=1`. See https://bixense.com/clicolors/ | | A fair number of tools support it. | roywiggins wrote: | Colorful prompts remind me of my time playing MUDs. The better | ones did a good job colorizing everything so you could navigate | almost by color alone. | IggleSniggle wrote: | One of the biggest upgrades from using fish is syntax | highlighting / autocompletion. You can get fish-style syntax | highlighting and autocomplete in zsh (which has the advantage of | being more interoperable with bash generally): | | [zsh-syntax-highlighting](https://github.com/zsh-users/zsh- | syntax-highlighting) | | [zsh-autosuggestions](https://github.com/zsh-users/zsh- | autosuggestions) | | Poster mentioned "modern alternatives exist" with good | colorization options. Some of my favorite colorized feature-rich | alternatives: | | ls -> [exa](https://github.com/ogham/exa) | | cat -> [bat](https://github.com/sharkdp/bat) | | du -> [ncdu](https://dev.yorhel.nl/ncdu) | | diff -> [delta](https://github.com/dandavison/delta) | | In combination with all of the above, | [fzf](https://github.com/junegunn/fzf) suddenly becomes a syntax- | highlighter preview-pane via leveraging bat (or delta, as the | case may be). | danyspin97 wrote: | Poster here! ble.sh gives syntax highlighting for bash just | like fish and zsh. I personally don't like zsh because it seems | over engineered and fish have some design problems (I don't | think they have yet fixed them). | | The feature-rich alternatives you mentioned are exactly what I | was thinking about (and using daily!). | IggleSniggle wrote: | There are a few things about zsh that "feel better" than bash | (especially arrays), but given the ubiquity of bash, if I can | get the same general quality-of-life upgrades that I | experience from the zsh community add-ons, I may need to give | ble.sh a go. | | Edit: I gave ble.sh a try, and it is super-cool-magic, but | does feel slow with quite noticeable input lag. | atdt wrote: | The GitHub link to Generic Colouriser points to an outdated and | unofficial fork. The canonical one is at | https://github.com/garabik/grc. | danyspin97 wrote: | Fixed, thanks you for pointing this out! | eddieh wrote: | I do like to have colorized output for my interactive CLI tools, | but I will never understand a prompt other than "$" or "#". | | Do people really need to continuously see all the noise like the | host name, their username, the working directory, the date, or | even their current branch? | | Is hostname, whoami, pwd, date, git branch, and git status really | to cumbersome? At least with hostname and branch I'm usually | piping to pbcopy anyway. | | FWIW, the -F option for ls is really nice too. | xiconfjs wrote: | about hostname in the prompt: if you are logged in to a bunch | of server debugging a problem, it's good to see from the first | sight on which system you are executing a command. | enriquto wrote: | > I will never understand a prompt other than "$" or "#" | | I agree with that, but some legit useful information in the | prompt is the exit status of the previous command. So you may | have a slightly less minimalist PS1='$?\$ ' which is typically | seen as "0$" unless something went wrong. Another legit and | useful information is the number of background jobs (set up to | the empty string for the common case of zero jobs). Other | information like the cwd, the time or the git branch are of | course idiotic. | isatty wrote: | For my local machines I don't bother with hostname, whoami or | date but the former two is essential on remote servers, so it's | good to have as defaults. | | pwd is really useful since I've tons of terminals on tmux and | typing pwd gets repetitive real quick. | CamperBob2 wrote: | _Do people really need to continuously see all the noise like | .... the working directory...?_ | | I can't imagine using a CLI prompt without knowing what | directory I'm in. How would that even work? | pen2l wrote: | I think in this day and age we should be making bigger jumps than | wanting color in our CLI. | | We should have more than one font, we should have pictures. We're | visual creatures, us humans. I think something like Jupyter, with | in-line images et al is the future, or should be, at least. | Icathian wrote: | I strongly disagree. If we're going to use a TUI, it should | embrace what it is. Turning it into a watered down GUI does not | work to its strengths nor serve the needs of the users still | working with it. | bmn__ wrote: | http://blog.z3bra.org/2014/01/images-in-terminal.html | | https://askubuntu.com/questions/97542/how-do-i-make-my-termi... | danyspin97 wrote: | I agree, but we're limited by terminal emulators. Not counting | images in terminal (which can be done with a protocol few | terminal supports), we don't even have Font Ligatures widely | available. | | https://github.com/tonsky/FiraCode#editor-compatibility-list | tzury wrote: | `diff --color=auto` is nice, but `vimdiff` is superior | ipozgaj wrote: | There is also `colordiff` which works both as a standalone diff | tool, but also as a colorizer filter for other diff tools. For | example: diff -u a.txt b.txt | colordiff | petepete wrote: | Git ships with `diff-highlight` which is more than enough for | me. | | I use the following config. [core] | pager = /usr/share/git-core/contrib/diff-highlight | less | [color "diff-highlight"] oldNormal = red | oldHighlight = 16 bold red newNormal = green | newHighlight = 16 bold green | erichdongubler wrote: | I myself have really enjoyed `delta` and the variety of | configuration it has: https://github.com/dandavison/delta | clintonc wrote: | I find myself wishing for a CLI "design system". For example, | given a script that calls some APIs (reads and writes) and does a | couple of calculations, what is the best way to use color and | space to produce understandable and useful console output? | rudiv wrote: | Love starship. Fast, easily customizable, and best of all works | on Windows as well as macOS/Linux. (Unsure about BSD, but I | presume that as well) | oweiler wrote: | Instead of `ls` I use `lsd` https://github.com/Peltoche/lsd. | makeworld wrote: | How does this compare to exa? | | https://the.exa.website/ | oweiler wrote: | `exa` provides more functionality but is also much slower. ___________________________________________________________________ (page generated 2020-07-26 23:00 UTC)