ENDARI
June 29, 2026

NeoVim

Posted on June 29, 2026  •  6 minutes  • 1262 words
Table of contents

Terminal, real home of any computer enthusiast.

Vim the simplest of all word processors, or in my slightly moderner case: “Neovim” is the step you get back before jumping far ahead! Yes, I know! At first it seems like a setback — with your 6-button mouse, or even worse your touch Apple Mouse, you wouldn’t even consider going back to a simple Terminal app with almost no GUI and the weirdest set of shortcut keys to be more productive. But that itself is one of the biggest catches of learning your way around VIM: the simplicity, and simultaneous customizability of vim is actually liberating.


Why I came back to the terminal

There’s something almost romantic about typing in a terminal. No distracting sidebars, no update notifications popping up, no “helpful” AI assistants trying to autocomplete your thoughts before you’ve finished them. Just you, the text, and a cursor that blinks with patience.

I didn’t start here. Like many, I began with VS Code, then JetBrains IDEs, then back to VS Code with a million extensions. Each switch promised productivity. Each delivered… more complexity. More RAM usage. More “wait, why is indexing taking 5 minutes?”

Then I watched a colleague edit a Kubernetes YAML file in vim — no, neovim — at 3x my speed. No mouse. No menus. Just muscle memory and intent. That was the moment I thought: maybe the step backward is actually the leap forward.


The Neovim difference

Neovim isn’t just “vim but newer.” It’s vim reimagined for the modern era:

The learning curve is real. I won’t sugarcoat it. Your first week will feel slow. Your fingers will rebel. You’ll accidentally open 5 buffers and not know how to close them. But then — something clicks. The modal editing model stops being a puzzle and starts being an extension of your thought process.


My current setup (the “stars” of the show)

After months of tweaking, here’s what makes my daily driver sing:

Plugin manager: lazy.nvim

Fast, declarative, with a gorgeous startup dashboard. Specifies plugins as a Lua table, handles dependencies, and only loads what’s needed when it’s needed.

-- lazy.nvim bootstrap
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath })
end
vim.opt.rtp:prepend(lazypath)

Fuzzy finding: telescope.nvim

The command palette on steroids. Files, buffers, git history, LSP symbols, live grep — all with the same fuzzy matching muscle memory.

{ "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" } }

Syntax & parsing: nvim-treesitter

Real AST parsing. Better highlighting, smarter text objects (select “function”, “class”, “comment”), and incremental selection that actually understands code structure.

{ "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" }

LSP & completion: mason.nvim + nvim-lspconfig + blink.cmp

Mason installs language servers. LSPConfig configures them. Blink.cmp (the newer, faster completion engine) handles suggestions. Together: IDE-level intelligence without the IDE bloat.

{ "williamboman/mason.nvim", config = true },
{ "neovim/nvim-lspconfig" },
{ "saghen/blink.cmp", version = "*" }

Git integration: gitsigns.nvim + fugitive.vim

Inline git blame, hunk staging, diff view — all without leaving the editor. Fugitive for the heavy lifting (rebase, merge, push), gitsigns for the daily glance.

Statusline: lualine.nvim

Clean, configurable, shows mode, filename, git branch, diagnostics, LSP status, file encoding — exactly what I need, nothing I don’t.

Theme: catppuccin (mocha variant)

Warm, readable, consistent across terminal and GUI. The kind of theme you stop noticing because it just works.


The Hugo workflow: where it all comes together

This post? Written in neovim. Published via Hugo. The friction is near zero.

Front matter? Handled.

A quick snippet (I use luasnip):

s("hugo", fmt([[
+++
date = {}
draft = true
title = '{}'
author = 'Abbas Endari'
description = '{}'
thumbnail = '{}'
+++
]], { f(os.date, "%Y-%m-%d"), i(1), i(2), i(3) }))

Type hugo<Tab>, fill the fields, done.

Markdown editing? Delightful.

Images? Drag and drop.

A small autocmd watches my content folder — paste an image in the terminal (via imgclip or OSC 52), it saves to static/img/, inserts the correct Hugo path. No manual mv commands.

Preview & deploy?

# Terminal 1 (tmux pane): hugo server -D
# Terminal 2 (neovim): write, save, see live reload
# Deploy: git push origin main → GitHub Actions builds & deploys

The loop is tight. Write → Save → Browser updates → Commit → Live. No GUI clicking. No context switching.


What this enables (beyond blogging)

The same setup that makes blogging pleasant makes everything pleasant:

The editor becomes a thinking tool, not just a typing tool.


The philosophy: invest once, compound forever

Here’s the thing about neovim: the configuration is the product.

Every hour you spend learning a keymap, writing a snippet, tuning a plugin — that hour pays dividends every single day after. Your config grows with you. It encodes your workflow, your quirks, your preferences. No UI designer at Microsoft or JetBrains decides what’s best for you. You do.

And because it’s plain Lua files in ~/.config/nvim/, it’s:


What’s next in this series

This post is the “why” and the “what.” The upcoming posts will be the “how”:

  1. From zero to configured — bootstrapping lazy.nvim, essential settings, keymaps that matter
  2. LSP deep divemason, lspconfig, blink.cmp, diagnostic UX, inlay hints
  3. Treesitter & text objects — selecting “inside function,” “around class,” swapping parameters
  4. Telescope workflows — custom pickers, live grep args, file browser, project switching
  5. Git superpowersgitsigns hunk operations, fugitive for rebase/merge, diffview.nvim
  6. Hugo-specific tooling — front matter snippets, image handling, shortcodes, preview automation
  7. Theming & polish — statusline, winbar, notifications, which-key, animation

Each post will be practical: config snippets you can copy, explanations of why not just what, and the small details that make the difference between “it works” and “it feels like mine.”


Your turn

If you’ve read this far, you’re either already a convert or vim-curious. Here’s my challenge:

Try it for 30 days. Not “open it once a week.” Daily driver. Force yourself through the dip. Remap Caps Lock to Escape. Print a cheatsheet. Watch ThePrimeagen or TJ DeVries on YouTube. Join /r/neovim or the Discord.

The first two weeks are awkward. Week three is “okay, I see it.” Week four is “how did I ever work without this?”

And if you hate it? You learned modal editing, Lua basics, and how LSP works — all transferable. But I’d bet my mechanical keyboard you won’t go back.


This post was written in Neovim 0.10, rendered by Hugo 0.120, deployed via GitHub Actions. Config at github.com/abbasendari/dotfiles (shameless plug — PRs welcome).

Next in series: “From Zero to Configured — Bootstrapping Your Neovim Journey”

Follow me!

I am on social media, but I'm not really into socializing over media!