Neovim, QMK, and the Tooling That Eliminated the Mouse for Me ⌨️
For the last few years, I’ve been optimizing one thing: reducing context switching.
Not “productivity hacks.” Not “10x engineer” nonsense. Just fewer interruptions between thought and execution.
At some point I noticed something that felt almost embarrassing in hindsight: the mouse and trackpad were responsible for a surprising amount of friction in my day.
Not the big, obvious interruptions. The small ones:
- the tiny focus break when your hand leaves the home row
- the micro-pause while you hunt for UI
- the precision targeting that forces your eyes to “scan”
- the constant switching between typing and pointing
Hundreds of those per day isn’t dramatic. It’s just… draining.
So I started removing them. Not completely at first, and not as a single “I’m going to be keyboard-only now” decision—but gradually, one rough edge at a time.
Today, most of my daily workflow—coding, navigation, Git, terminal work, browser usage, and a handful of OS actions—happens entirely from the keyboard.
This article is the stack that made that possible:
- Neovim
- QMK
- terminal-first tooling
- browser navigation
- OS glue (BetterTouchTool)
- a bunch of small ergonomic decisions that compound over time
The philosophy: minimize cognitive friction
The biggest benefit isn’t speed. It’s continuity.
When your hands stay on the keyboard, your brain stays “inside” the task. Navigation becomes subconscious. Commands become muscle memory. The interface fades away.
Eventually the computer starts feeling less like a GUI you operate and more like an instrument you play.
That’s the real goal.
Neovim: editing as a language, not a UI
Neovim (neovim.io) changed how I think about editing—not because it’s “better” than every IDE, but because modal editing reduces the cost of interaction.
Instead of selecting text with a mouse, dragging, clicking menus, and bouncing between panels, you compose intent:
ci(vi":%s/foo/bar/gggVG
Editing becomes a language instead of a UI interaction. Once motions become muscle memory, normal editors don’t feel “bad”—they just feel like they’re asking you to do too much through pointing and visual scanning.
Movement is the foundation (not plugins)
People obsess over plugins. Plugins are useful, but the real power starts with movement and targeting:
- small hops (
f,t,;,,) - text objects (
ci",da),yip) - search-driven navigation (
/,n,N) - marks and jumps
When those are fluent, your cursor stops traveling “because it has to” and starts traveling “because you want it to.”
Search as UI: I use Snacks instead of Telescope
I used to rely heavily on Telescope (nvim-telescope/telescope.nvim). These days, I prefer Snacks (folke/snacks.nvim)
The pattern is the same either way: you stop navigating UI, and you start navigating search.
Files, grep, diagnostics, buffers, commits, symbols, references—everything becomes searchable. The keyboard becomes the UI, and you spend far less time “managing” the editor.
File operations without leaving the editor
For file operations I like Oil (stevearc/oil.nvim).
It’s one of those plugins that feels boring until you realize how often you used to context-switch just to rename, move, or inspect files. Oil makes those actions feel like part of editing instead of “go do a separate task.”
Terminal-first tooling: make the terminal good enough that you stop escaping
The second big shift was treating the terminal as the primary interface for everything around the code:
- Git
- package management
- logs
- SSH
- scripting
- orchestration
The tools matter, but the principle matters more:
Make the terminal pleasant enough that you stop escaping to GUI.
Here are a few staples in my setup:
- tmux:
tmux/tmux - lazygit:
jesseduffield/lazygit - ripgrep:
BurntSushi/ripgrep - fzf:
junegunn/fzf - zoxide:
ajeetdsouza/zoxide - bat:
sharkdp/bat - eza:
eza-community/eza
tmux: continuity that survives reboots
tmux isn’t just “splits.” It’s continuity.
Sessions persist. Layouts are reproducible. Navigation becomes a reflex. When your machine restarts, you don’t rebuild your mental state from scratch—you reconnect to where you were.
That changes the feel of your entire workflow.
tms: I built my own session manager (and learned a lot)
There are many session managers out there, and a lot of them are excellent—but none matched what I wanted closely enough.
So I built tms.
Not because it’s revolutionary (the wheel is cheap to reinvent these days), but because it let me shape the exact experience I wanted—and I learned a lot in the process.
tms lives in my dotfiles here: dot-files/tools/tms.
tmux popups: a small feature with huge leverage
tmux popups are underrated until you wire them into daily muscle memory.
With a bit of configuration, I can open a right-side popup in the context of the current session—no window rearranging, no layout disruption, no “where did my terminal go?”
In my setup:
Ctrl-popenstmsin a popup (project/session picker)Ctrl-yopens Claude in a popup for the current session path
It sounds like a small trick. In practice, it changes behavior: asking a question, checking an idea, or running a helper becomes a quick “side panel moment,” not a full context switch.
QMK: the biggest upgrade was hardware
QMK (qmk.fm / docs.qmk.fm) was probably the highest ROI change overall—not because it gives you more shortcuts, but because it changes the shape of your interaction.
Your keyboard stops being a static device and becomes part of your toolchain.
My current daily driver is a Keyboardio Atreus (40%): shop.keyboard.io/products/keyboardio-atreus.
I didn’t start there. I went through the classic progression:
- TKL (about ~10 years ago)
- 60%
- 40% (and then… I stopped wanting to go back)
If I get the chance, I’d happily go smaller again.
The important part isn’t “fewer keys.” It’s reducing finger travel.
Layers > reaching
Once you accept layers, a lot of “missing keys” stop being missing.
Arrows under the home row. Symbols close to where you already type. Numbers without stretching. Your hands stay put, and you feel the difference after long days.
Mouse keys: used regularly, then gradually eliminated
I also use mouse keys—not as an emergency fallback, but as a normal part of my workflow. I have a dedicated mouse layer and I use it regularly.
But the interesting part is the trajectory: as you build real muscle memory (Neovim, terminal workflows, browser navigation), you naturally touch mouse keys less and less. They’re like training wheels you can keep around until you realize you haven’t needed them for a week.
I even tried using mouse keys for Figma. It’s not ideal (Figma wants precision), but I also didn’t find it unbearably inconvenient for quick tweaks—which surprised me.
If you’re choosing hardware: go ergonomic
If you only take one hardware takeaway from this post: I strongly recommend an ergonomic keyboard over a classic slab keyboard (and especially over a laptop built-in keyboard) if you spend serious hours typing.
It’s not about aesthetics. It’s about strain.
Browser navigation without a mouse
The browser was the hardest piece to make keyboard-first, because most of the web is still designed for clicking.
But “link hinting” extensions get you surprisingly far:
- Vimium:
philc/vimium - SurfingKeys:
brookhong/Surfingkeys - Tridactyl (Firefox):
tridactyl/tridactyl
Once you adopt one of these, a lot of browsing becomes muscle memory: open tabs, switch tabs, follow links, scroll, search, jump.
It’s not perfect—some sites fight you—but it pushes the baseline from “mouse required” to “mouse is the fallback.”
BetterTouchTool: one shortcut I use every day
I don’t use many BetterTouchTool features, but one is non-negotiable: a shortcut to move the current window between monitors without touching the mouse.
It’s basically “move to X/Y” plus a focus/click action so the window is immediately active. Simple, boring, extremely high leverage.
Docs: folivora.ai/docs.
The unexpected benefit: reduced fatigue
Most people expect the payoff to be speed. Mine was comfort.
Less wrist movement. Less shoulder movement. Fewer tiny precision adjustments.
After long days, the difference is noticeable—especially if you combine it with the unglamorous basics: decent desk setup, sensible monitor height, and a keyboard that doesn’t force your hands into awkward posture.
The hidden downside (and the trap)
This setup has real costs:
- onboarding friction
- muscle memory retraining
- configuration maintenance
- the occasional “why did this keybinding break today?”
And there’s a trap: you can optimize tooling more than you create.
Tooling should earn its keep. If it doesn’t pay back time and attention, it becomes another distraction.
My configs
- Dotfiles (Neovim/tmux/zsh/etc.): github.com/ryenguyen7411/dot-files
- QMK fork for my Atreus: github.com/ryenguyen7411/qmk_firmware/tree/f-rye-keyboardio-atreus (my own fork, I haven’t had time to upstream changes back to the main QMK repo yet)