I’ve been a command line user from the very first computer steps I took with a Commodore 64, which dropped the user right into BASIC, an interface I would consider to be in a similar category. Even through years of Windows use (95, 98SE, 2000, and XP), I was no stranger to
CMD.exe. And over the last nearly two decades of Linux and then macOS use, I’ve become pretty devoted to the terminal.
Many different tools have made this journey both possible and delightful, and today I want to call out a few somewhat less known (mostly) non-built-in ones I use fairly regularly, as well as some of the alternatives I think deserve honorable mentions.
For context, I’ve been a full-time macOS user for about a decade and a half at this point, but I’m reasonably sure most of the tools covered here work just fine on Linux, BSD, etc.
I’ve been using kitty for over a year now, and it’s been a pretty great experience. It supports panes, tabs, and multiple windows, can be controlled via command line, and is blazing fast.
These days I’m a rather happy fish shell user, as it’s been a bit friendlier of an experience than other options. My prompt is nice and fast courtesy of Starship, and I just started using Atuin for my shell history and am liking it so far.
Honorable mention goes to tmux, which I don’t currently use as kitty does the trick, but which was an indispensable part of my toolchain for years.
bat is a faster, prettier
cat. Built-in syntax highlighting alone has made it worth installing for me.
broot is an awesome fuzzy directory navigator and file path manipulator. I mostly use it for viewing directory trees and renaming deeply nested files.
exa is a next generation
ls replacement. I’ve aliased
l to it and am generally unaware that it’s what I’m using.
ripgrep is a next generation, ridiculously fast
fzf is an awesome command line fuzzy finder. Piping output of, say,
ripgrep to it makes for a lovely interactive search experience.
watch is a classic command repeater. I often start some process and then
watch -n .1 ls in another window to see the progress.
dfalternative. I don’t use it often, but I like the pretty when I do.
My primary editor for the past couple of months has been Helix. It’s been working great for me, and I’ve been customizing it slowly and organically. I love how fast it is, and how well It Just Works™.
Perhaps the main highlight is the inversion of Vim’s traditional verb→object order (e.g.,
d5w) to the much more natural (to me) object→verb order (e.g.,
5wd). I really appreciate always seeing the selection of text I’m about to change.
There is currently no plugin system, though that will change in the future, but in two months of use I’ve yet to find myself seriously wishing that were already resolved.
The only version control system I use these days is good old Git, and I enhance my use thereof with two other tools.
Firstly, I perform nearly all my Git operations with lazygit. It’s a fantastic terminal UI for Git. I love it so much I nearly always have it open in a dedicated terminal tab for every project I’m actively working on at the time.
Secondly, since all my stuff usually ends up on GitHub, gh makes interacting with repositories from the command line a breeze. I don’t tend to do too much with it, but it’s a handy way of treating issues as to-do lists, for example.
Honorable mention: vimagit was one of my favorite things about using Neovim and Vim.
My favorite API client is Hurl, which is actually a full fledged HTTP client that I tend to use primarily for working with REST APIs. It uses beautifully simple request syntax and offers a few tools for working with responses.
From the same developer comes devd, which is just a simple, reliable webserver I sometimes use when working on static web content.
My primary language for many years has been Python. I’ve used more Python related tools than I could possibly keep track of, but two stand out the most.
The first is pipx, which is meant for installing command line Python tools in their own self-managed, isolated virtual environments. For example, I use it to install the Black formatter globally.
The second is Poetry, which I use to manage dependencies for all my projects, as well as build packages for publishing on PyPI.
While I write a lot of small tools for small tasks with frequency, pbclear stands out and gets a decent bit of use. It is my own complement to the macOS built-in
pbpaste, and all it does is send contents of
/dev/null to said
pbcopy. I don’t entirely know why I’m so insistent on clearing my clipboard all the time, but it makes that easier.
This was a lot of fun to write, honestly. I mostly based it on the output of
brew list, with some pondering about past choices and alternatives.
I also actually learned something: I should use
fzf for a lot more than I do.