My Neovim Config (and Why You Should Care)
I use Neovim. There, I said it. Before you click away thinking "oh great, another Vim zealot telling me my IDE is garbage" — sit down, shut up, and hear me out. I promise I won't say hjkl more than... okay, I'll say it a few times. But there's a reason.
Why Vim Motions Are Actually Insane
Here's the thing nobody tells you when you're starting out as a developer: you spend roughly 90% of your time reading code and moving around files, not actually typing new code. The bottleneck isn't your typing speed. It's how fast you can navigate, select, delete, rearrange, and manipulate the text that's already there.
Vim motions are like giving your keyboard a PhD in text manipulation. ciw — change inner word. da{ — delete around braces. yap — yank a paragraph. You're not pressing keys one at a time anymore; you're composing commands. It's like going from pointing at letters on a whiteboard to writing actual sentences.
Does it feel weird at first? Absolutely. You will open Vim, try to type, and nothing will happen. You will Google "how to exit Vim" at 2 AM and question every life decision that led you here. That's normal. That's the initiation ritual. After about a week, something clicks, and suddenly your mouse feels like a steering wheel made of wet spaghetti.
But It's Not for Everyone (And That's Fine)
Look, I'm not going to pretend Vim motions are the answer to all your problems. If you're happy in VS Code, if your workflow is smooth, if you're shipping code and solving problems — you don't need Vim. Vim motions won't fix your broken TypeScript types. They won't debug your React re-renders. They won't make your Python script run faster.
But if you've ever felt like your editor is slowing you down — if you find yourself reaching for the mouse every 3 seconds, if you're tired of clicking through menus, if you want to feel like you're actually controlling your code instead of just editing it — then Vim motions might be worth a look.
The best part? You don't even need to use Neovim to try them.
The "Try Before You Commit" Starter Pack
Before going full Neovim, try Vim motions in your current editor:
- VS Code — Install the
vscodevimextension. That's it. You get Vim keybindings inside VS Code. Keep your extensions, keep your theme, keep your comfort. Just start moving faster. - Zed — Has built-in Vim mode. Toggle it on, and you're good. Zed is fast as hell too, so you get Vim motions and a modern editor.
- JetBrains — The IdeaVim plugin. Same deal. Vim inside your existing IDE.
If after a month you're thinking "okay, this is actually kind of nice" — then maybe it's time for Neovim. And if you want a starting point that won't make you want to throw your laptop into the sea, use kickstart.nvim.
Kickstart is a single-file Neovim config maintained by TJ DeVries (the guy who basically built half of the Neovim ecosystem). It's not a distribution — it's a starting point. One file. You read it, you understand it, you customize it. No 400 plugins you'll never configure. No black magic. Just Lua code you can actually read.
My Config: Where Kickstart Ended and Opinions Began
My nvim config started from kickstart, but it's evolved into something more structured. It's modularized now — not the single-file approach anymore. The config lives in lua/custom/ with separate directories for plugins, LSP, and utilities. The philosophy is still the same though: if I don't use it, it's gone. If I can't explain what a line does, it doesn't belong.
The Structure
The entry point is still one init.lua, but it's lean. It loads keymaps and options immediately, defers the statusline until the first buffer opens, and lazy-loads utility modules (floating terminal, sessions, tabs) in the background. Then it bootstraps lazy.nvim and loads plugins from two directories:
lua/custom/plugins/— one file per plugin or plugin grouplua/custom/lsp/— LSP config, autocomplete, and formattinglua/custom/util/— floating terminal, session management, tabs
Everything is lazy-loaded by default. A plugin only loads when you actually trigger it. Startup is fast because nothing is loaded until you need it.
Plugins (What's Actually In There)
Let me walk through what I'm running and why — because every plugin earns its spot.
Telescope — The fuzzy finder. Files, grep, buffers, git commits, diagnostics, help tags — everything goes through Telescope. It's hooked up with fzf-native (compiled with Zig for speed) and ui-select so vim's built-in code action menus use the Telescope UI instead of that ugly default popup. Keybindings are all under <leader>s for search and <leader>g for git.
Treesitter — Syntax highlighting that actually understands your code. Instead of regex (which is like reading a book one letter at a time), Treesitter parses your code into a tree structure. Highlighting, indentation, and code context all make sense now. Auto-installs parsers for whatever language you open.
Flash — Press s and type a few characters — every match on screen gets a label. Type the label, you're there. It's like easymotion but actually good. Works in normal, visual, and operator-pending modes. S does the same thing but for Treesitter nodes, so you can jump to specific code structures.
Blink.cmp — Autocomplete engine. I switched from nvim-cmp to blink because it's faster and the config is cleaner. Sources are LSP, path, snippets, and buffer. Completion menu shows the source ([lsp], [snip], [buf]) so you know where suggestions come from. Auto-brackets are enabled. Tab and Shift-Tab cycle through completions and jump snippets.
Conform — Formatter. Runs on save. stylua for Lua, biome for JavaScript/TypeScript/Vue/HTML/CSS/JSON. No config files to maintain — it just works.
Gitsigns — Git diff indicators in the gutter. But the real killer feature is inline blame — every line shows who last touched it and when. ]c and [c jump between hunks. <leader>hs stages a hunk. <leader>hp previews it. Full git workflow without leaving the buffer.
Mini.nvim — A bundle of small, focused plugins. I use: mini.pairs (auto-close brackets), mini.surround (add/delete/replace surrounds with gsa/gsd/gsr), mini.ai (enhanced text objects), mini.comment (toggle comments), mini.indentscope (visual indent guides), and mini.notify (clean notification popups). One import, six plugins, zero bloat.
Which-key — Shows available keybindings as you press them. Uses the helix preset for a clean popup. This is how you learn your own config without memorizing everything upfront.
Oil.nvim — Press - and you get a file browser that works like a buffer. Rename files by editing text. Create files by typing a new line. Delete by removing the line. It's the most intuitive file manager I've used.
Neo-tree — Toggle with <leader>e. Opens on the right side. I use Oil more, but Neo-tree is there for when I want a visual overview of the project structure.
LazyGit — <leader>gg opens a full git TUI in a floating window. Commits, branches, stashing, rebasing — all from a proper UI without leaving Neovim.
Render-markdown — When you open a .md file, it renders headings, checkboxes, code blocks, and inline formatting with proper styling. Writing markdown in Neovim finally looks good.
Todo-comments — Highlights TODO, FIXME, HACK, NOTE in your code. ]t and [t jump between them. <leader>st searches all todos across the project via Telescope.
ts-autotag — Auto-closes and renames HTML/JSX tags. Type <div> and the closing tag appears. Rename the opening tag, the closing tag updates. Small thing, big quality of life.
LSP (nvim-lspconfig + Mason) — lua_ls for Lua, ts_ls for TypeScript/JavaScript (with Vue support via the Vue language server plugin), stylua for formatting. Mason auto-installs what's needed. fidget.nvim shows LSP progress in the corner so you know when the server is doing something.
Hand-Built Statusline (No Plugin Needed)
I don't use lualine or any statusline plugin. It's a hand-written Lua function in statusline.lua that renders directly into Neovim's native statusline. Shows the mode (color-coded — violet for normal, blue for insert, cyan for visual), git branch (from gitsigns), diagnostics count, current file, LSP client name, filetype, line/column, and scroll percentage. About 150 lines of Lua. No dependencies. Loads after the first buffer to save ~5-10ms on startup.
Custom Utilities
- Floating terminal —
<leader>tttoggles a floating terminal at 80% of the editor size. Reuses the same buffer. Auto-closes when the shell exits.<Esc><Esc>exits terminal mode. - Sessions — Auto-saves and restores your session so you pick up where you left off.
- Tabs — Better tab/buffer management.
Sensible Defaults (The Boring Stuff That Matters)
A few things in options.lua that make a real difference:
- Relative line numbers — you know how far away things are
scrolloff = 10— keeps the cursor 10 lines from the edge so context is always visible- Transparent background — the editor background matches your terminal
cmdheight = 0— hides the command line until you press:, gives you an extra line of code- Cursorline only in the active window — the focused window has a highlighted line, others don't
- Smooth scrolling — because why not
; as :— press;to enter command mode. One less keypress every time.Alt+j/kto move lines up/down — because sometimes you just need to reorder things fastCtrl+d/ucenters after half-page jump — no more losing your cursor
Disabled Built-In Plugins
Neovim ships with plugins most people never use. I disable: gzip, tar, zip, netrw, tohtml, matchit, matchparen, rplugin, editorconfig, man, and spellfile. Each one is a tiny startup cost that adds up. If I need them, I can re-enable them. So far, I haven't.
How It Can Help You If You're New
If you're just starting to code, here's what this config gives you out of the box:
- Autocomplete that actually works without being annoying
- Errors highlighted in real-time so you catch mistakes before running the code
- Fast file navigation — no more scrolling through a file tree, just fuzzy search
- Git integration built right into the editor — blame, stage, diff, without leaving your code
- A statusline that tells you everything — mode, branch, errors, file, position
- A floating terminal — run commands without leaving Neovim
- Which-key — shows you what keybindings are available as you press keys
You don't need to understand everything on day one. Clone the config, open Neovim, start writing code. Which-key will guide you. Learn the motions as you go. i to insert, Esc to go back to normal mode, :w to save, :q to quit. That's enough to get started. The rest comes naturally.
The "How Do I Exit Vim" Section
Just kidding. It's :q. Or :wq to save and quit. Or ZZ if you're feeling fancy. Or :qa! if you're having a mental breakdown. Or <leader>x in my config because I got tired of typing :wq like a caveman.
In all seriousness — the learning curve is real, but it's front-loaded. You struggle for a week, then you're productive, then you're faster than you were before, and you never look back. It's like learning to ride a bike. Except the bike is your text editor, and falling down is accidentally deleting 47 lines with dG.
Links
- My config: github.com/lubasinkal/nvim
- Kickstart.nvim (the starting point): github.com/nvim-lua/kickstart.nvim
- The video that started it all: The Only Video You Need to Get Started with Neovim