You, me and Neovim
Blog

You, me and Neovim

neovimeditorsworkflow

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.