Skip to main content
  1. Posts/

Living in the Terminal

·1145 words·6 mins
Photograph By Oleksandr Chumak
Blog Terminal Productivity
Table of Contents

The Mouse Incident
#

I don’t remember the exact moment I stopped reaching for the mouse. It was gradual, like losing an accent. One day I was alt-tabbing between VS Code, GitHub Desktop, and Finder like a normal person. The next, I had NeoVim, lazygit, and yazi all living in tmux panes, and the mouse was collecting dust next to a coaster I also never used. Looking back, I think it started with the vim keybindings.

I was watching The Primeagen absolutely fly through a codebase, and I thought, “I want to move like that.” Not because it would make me a better engineer (debatable), but because it looked like the editor was an extension of his brain. There was no friction between thinking and doing. So I installed the Vim extension in VS Code, suffered for two weeks, and then fell in love.

Git Bash and Broken Dreams
#

For context, my terminal experience on Windows was limited to git bash. That’s it. That was the whole relationship. I used it to git add, git commit, git push, and occasionally panic-google “how to undo last commit.” The terminal was a necessary evil, not a place I wanted to live.

Then I got a job as a systems engineer, and suddenly I was SSH-ing into Linux servers daily. Ubuntu servers, specifically. No GUI. Just a terminal and whatever tools were installed. And you know what? It wasn’t that bad. The more time I spent in the terminal out of necessity, the more comfortable it became. By the time I transitioned to software engineering and got my hands on macOS, I already had the terminal itch. Going from Windows to Ubuntu to Pop!_OS to Arch wasn’t a planned journey — each step just naturally pushed me deeper into terminal-land.

The Toolkit (or: How I Stopped Worrying and Loved the TUI)
#

So what does a terminal-first workflow actually look like? Here’s what I use daily:

tmux is the foundation. It’s a terminal multiplexer — which is a fancy way of saying it lets you have multiple terminal sessions in one window, split into panes, and detach/reattach from anywhere. I changed the prefix from Ctrl+B to Ctrl+S because it’s closer to home row and doesn’t fight with NeoVim. I also rebound splits to | and - because… they look like what they do. Vertical line = vertical split. Horizontal line = horizontal split. Revolutionary, I know.

# Visual mnemonics > arbitrary keybindings
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -c "#{pane_current_path}"
# Vim-style pane navigation (because why wouldn't you)
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

NeoVim with LazyVim is the editor. 39 plugins, LSP support via Mason, TreeSitter for syntax highlighting, flash.nvim for jumping to any visible character, and the whole thing starts in under 100ms. For comparison, VS Code takes about 3-5 seconds on my machine. The biggest adjustment was remapping save — Ctrl+S is taken by tmux now, so it’s <leader>bw. Small price to pay.

lazygit was the single biggest quality-of-life upgrade. Interactive rebase used to genuinely scare me. Now I press e on a commit. Staging individual hunks? space. Cherry-pick? Done. The thing about lazygit is that it made git about the actions rather than remembering the syntax. I don’t need to recall git stash push -m "message" — I just press s on the stash panel.

yazi replaced Finder for file navigation. It’s written in Rust, it’s fast, and it previews files (including images) inline in the terminal. I honestly forget Finder exists sometimes.

k9s is what I use for Kubernetes. Instead of typing kubectl get pods -n my-namespace, I type :pods. Instead of kubectl logs pod-name -f, I select the pod and press l. I even set up aliases so :dp jumps straight to deployments. Once you get used to this, going back to raw kubectl feels like writing SQL by hand when you have an ORM.

And then there’s the supporting cast — fzf for fuzzy finding everything, ripgrep for searching codebases at absurd speeds, fd for finding files without the cursed find syntax, and gh for managing GitHub without opening a browser.

The Part I Didn’t Expect
#

Here’s what I didn’t realize when I was customizing tmux panes and tweaking NeoVim configs: I was accidentally building an accessible workflow.

Terminal-first tools are text-based. That’s their whole thing. And text-based tools work with screen readers. A blind developer can navigate NeoVim with a screen reader far more effectively than they can navigate VS Code’s GUI, because the terminal outputs text characters, not rendered pixels. The same keyboard-driven design that makes me faster makes development possible for developers with vision impairments.

Think about it — every tool I listed above is fully keyboard-driven. There’s no “click this button” anywhere. Navigation follows consistent patterns (h/j/k/l works in NeoVim, lazygit, k9s, and yazi). Status is conveyed through text, not just colors. And the whole stack works over SSH, which means a developer using assistive technology at home can access their full environment on a remote machine with zero additional setup.

I’m not saying I switched to terminal tools for accessibility reasons. I didn’t. I did it because vim motions looked cool and Electron apps were eating my RAM. But the overlap between “fast and ergonomic for me” and “accessible for someone with a disability” turns out to be almost a circle.

So Is It Worth It?
#

Honestly? It depends on the tool.

lazygit and k9s — absolutely worth it. These aren’t about being cool or living in the terminal for the aesthetic. They genuinely save time by turning syntax into actions. If you work with git or Kubernetes regularly, install these today. You’ll wonder how you lived without them.

NeoVim — this one’s complicated. I love it. The code navigation is incredible, and once modal editing clicks, regular editors feel like typing with mittens. But has it made me a better engineer? Probably not, if I’m being honest. Especially now that AI coding assistants are everywhere — I use Cursor with its vim plugin for anything that leans heavily on AI. The vim plugin is good enough, and Cursor’s AI integration is better than what I have in NeoVim. So I bounce between both.

tmux — worth it if you SSH into machines or want persistent sessions. On a local machine with a good terminal emulator, the value is less obvious, but I still use it out of habit and because the sessionizer lets me jump between projects instantly.

The real answer is: start with the tools that solve an actual problem for you. lazygit solves “git is scary.” k9s solves “kubectl is verbose.” If you find yourself reaching for the terminal more and more, the rest of the stack will follow naturally. That’s how it happened for me, anyway.

Aaron Yong
Author
Aaron Yong
Building things for the web. Writing about development, Linux, cloud, and everything in between.

Related

Load testing with Grafana K6
·1414 words·7 mins
Photograph By National Cancer Institute
Blog Testing Node.js
Our first foray into load testing our backend APIs
Logging Google App Engine Applications
·1097 words·6 mins
Photograph By Kelly Sikkema
Blog Google Cloud App Engine Node.js
How to add logging to your Google App Engine application
Deploying a website with Cloudflare & Hugo
·834 words·4 mins
Photograph By Alexey Demidov
Blog Hugo Deployment
Static website deployment with Cloudflare and Hugo