I read Julia Evans’s blog post on “What’s involved in getting a modern terminal environment” and got very excited because there are lots of great comments in that blog post, and I have a few more of my own, and a little meta-commentary.
The terminal and the shell
Are there good modern answers for terminal software? Sort of. There are certainly many options. I still use iTerm2. I try other fancy new terminal software but end up back at iTerm2 every time for the combination of Macintosh features and overall performance. The Electron ones are sluggish enough that I feel it. Warp is the magical one I tinker with sometimes. I loathe the idea of online sharing features or LLM auto-completion in my terminal, so I pretend those don’t exist and that it’s free software. The existence of those features for money in Warp might either please or distress you. It is, however, truly a modern take on what a terminal experience can be.
Windows didn’t have any good terminal programs other than the built-in one in VSCode until recently. The default Terminal program is now just fine. I use wezterm when I’m using Windows. This requires customization with Lua and is not particularly modern or magical or command-aware or anything like that, but it is zippy and therefore better than VSCode. (I note, in passing, that Windows is a pretty important environment for lots of programmers, and Rust treats Windows as a first-class target, so Rust projects can do nice things for Windows users if their authors wish.)
The shell is no contest. Use the fish shell, as Julia recommends. You nushell users are a special sort of human; you may continue being you.
If your fingers type !!
and !$
enough to miss those bash-isms, install oh-my-fish and get the bang-bang
package. There are some other nice things there to snag.
Like Julia, I install every base16 theme there is. I change my theme colors and monospaced typeface about once a year, to keep my brain thinking everything looks different. I have no idea if this is helpful to anything or not, but I like to pretend it is. Get a Nerd font variation to keep the prompt looking right. Some good ones to consider: Cascadia Code, Iosevka, Fira Code, Monaspace.
Oxidize everything
Rust gave us all a systems programming language with ergonomics considerably better than the hand-held table saw that is C++, and the terminal experience is better for it. Look for modern Rust variations of everything, and for a handful of neat Golang tools as well.
Start by aliasing ls
to eza. You will not look back.
I stopped fussing about prompt setup when I found Starship. Well, you have to fuss, but only once and then you’re done forever. Customize with toml once, put the toml into your dotfiles repo, then you have a prompt that works with any shell you are using at the moment, in whatever terminal in whatever environment.
You have lots of options for reading text in the terminal that aren’t just cat with one of two pager variations we’ve had for 35 years. Why not read styled markdown?
Install the fuzzy-finder fzf and its integration with your chosen shell (which of course is fish
, finally a shell for the 90s). This is a subtle enhancer for everything if you start thinking of it as a part of how you find and select things. Many other tools come with fzf
integrations built in directly, or you can shell-script it on up. You can get ripgrep (which you should be using too, come to think of it) into the mix to get find file in project with fzf.
Editors
I don’t edit text in the terminal. For most editing, I use zed and zed
’s terminal integration. I don’t have any interest in “collaborating” with stochastic parrots, but I do have a very high interest in snappy editors with excellent language server integration. I switched to zed
from VSCode a couple of years ago and haven’t looked back.
I do still edit some files in the terminal, out of very old habit. When I edit dotfiles and other system configuration files, I type vi
and open them up right there. Why vi
? Because I am old and why type three characters when two is enough? vi
dates back to Bill Joy, if I recall, and that’s 40 years ago.
Editing text is not a modern thing to do inside the terminal, I think. But is modernity really what we’re going for? After all, people still use vim
and neovim
to write software effectively every day.
I say something about goals
“Everything affects everything else” is true and so is the fact that nothing is perfectly consistent with everything else. It was all implemented at different times over decades by cats who resisted herding, or who were working in a slightly different context than the other cats, with different libraries. And all these grumpy cats were doing the essentially stupid thing of kind-of emulating a dead hardware terminal from a dead microcomputer company that turned into ANSI eventually. That it works at all is nice; that we can get it to do decent things is surprising. I’m not sure what it means that it’s still by far the most effective way to get programming work done for many people.
So the terminal is a weird mess, yup. Changing your setup is disruptive if you do it rarely. You get practice in setting things up if you throw things up into the air often, though, and that’s why I do it. I try new things far more often than I choose to integrate them into my daily shell workflows. I can’t tell you how many times I’ve tried shell history things that promise to revolutionize my shell experience that ended up driving me to distraction within 15 minutes. It’s at least, um, twice? Once? Once for sure. I found all of the above things and a lot more that I am restraining myself from listing here by experimenting a little bit every so often with things I hear about.
Changing my setup isn’t the goal, really. Finding things that are worth integrating from the seething stew of modern software, that’s my goal. What makes them worth integrating? Well, it’s not modernity, not primarily anyway, as I say above. Modernity doesn’t select modal editors. Modernity doesn’t reach for the terminal. Modernity abandons the VT100 and sets up a mouse and windows.
So we’re not trying to be modern. We’re trying to be effective. Terminals and vim
are effective and, in the hands of experts, powerful. Aim for the set of tools that make you effective. Select new tools based on how they’ll make your more effective at whatever it is you’re doing in the shell. Try things, reject some, integrate others. Tell your friends about the good stuff. (Tell me about the good stuff, too, thanks.)