
You, me and Neovim
There are editors you use, and then there are editors that change how you think about editing. Neovim is the latter.
I didn’t start with Vim. Like most people, I started with VSCode — plenty of extensions, a comfortable GUI, and zero modal ambiguity. It worked. But somewhere between the thousandth time reaching for the mouse and the hundredth repetitive find-and-replace, I started wondering if there was a better way.
Table of contents
The modal difference
Vim’s modal editing is often described as efficient, but that undersells it. The real shift is cognitive: instead of treating text as something to type, you treat it as something to manipulate.
ciw → change inside word
da" → delete around quotes
>j → indent this line and the next
Each keystroke becomes a verb with a noun. It’s composable in a way that feels closer to a programming language than a text editor. Once that clicks, going back to a modeless editor feels like giving up a dimension.
Why Neovim instead of Vim
Neovim is not just “Vim but newer.” It’s a ground-up refactor that preserves the soul of Vim while shedding decades of architectural cruft:
- Built-in LSP client — no more installing language-specific plugins for autocomplete, go-to-definition, or diagnostics
- Lua as a first-class config language — Vimscript gets the job done, but Lua is faster, cleaner, and has proper data structures
- Async by default — job control, UI events, and plugin operations don’t block the editor
- Treesitter — syntax-aware highlighting and text objects that understand your code’s AST, not just regex
My config philosophy
I keep my init.lua minimal. Not because I don’t like customization, but because I’ve learned that every plugin you add is a cognitive dependency. The goal is an editor that gets out of your way, not one that takes over your terminal.
-- The essentials
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
-- LSP
local lspconfig = require('lspconfig')
lspconfig.ts_ls.setup({})
lspconfig.rust_analyzer.setup({})That’s enough to be productive. The rest I add only when I feel the pain of not having it.
The philosophy of tools
There’s something satisfying about using a tool that rewards deliberate practice. Neovim has a learning curve, but it’s not a wall — it’s a staircase. Every week you learn one new motion, one new operator, and gradually the editor becomes an extension of your thinking.
It reminds me of what Gilbert Ryle called knowing-how versus knowing-that. You can read about ciw all day, but until you’ve used it a hundred times until it’s reflexive, you don’t really know it. The tool teaches you by demanding that you use it properly.
And that, I think, is the deepest pleasure in crafting software: finding tools that make the craft itself more thoughtful.