Custom Neovim IDE
Problem
I'd been using Cursor as my daily driver for a while, and for the most part it worked fine. But I really didn't like the lack of customisation and control I had over it, and I had the feeling I was using someone else's tool rather than one built the way I like it.
Most of these tools are general purpose, and in trying to cater to everyone's needs, they end up perfectly fitting no one's. So I decided to build my own.
I'd heard about Neovim's reputation for speed and customisability for years, but always assumed the learning curve wasn't worth it. Eventually curiosity won out, and I decided to actually build a setup from scratch.
What I built
Starting from a completely bare init.lua, I built out a full custom IDE, piece by piece. I wrote the entire configuration to fit my exact needs, which meant learning Lua and a lot about Neovim's internals along the way.
Core editing
- A Windows-native keybinding layer (copy, paste, undo, select-all) on top of Vim's modal editing, so I didn't have to abandon muscle memory overnight.
- A custom word-jump motion, written from scratch, that treats punctuation the way modern IDEs do rather than the way vanilla Vim does.
- A close-buffer-with-save-prompt function that mimics the Save / Discard / Cancel dialog from GUI editors.
AI tab completion
- AI tab completions with Supermaven, it was free and quite fast, so I decided to include it.
Navigation and project management
- A persistent recent-projects picker that remembers every project I've opened, with a live, colourised preview of the folder contents.
- A full in-editor filesystem browser so I can jump to any folder or repo on my machine and lock it in as my project root.
- A file tree that automatically expands to whatever file I'm working on.
- Telescope tied together with LazyGit, giving me a proper GUI-style git interface without leaving the editor.
Polish
- A custom dashboard, Duskfox theme, ASCII art, and statusline showing git branch, live diagnostics, and more, replacing Neovim's plain default bar.
- A custom icon for the taskbar shortcut.
- A unified command layer so that PowerShell and WSL actually behave the same.
- A self-documenting shortcuts popup that reads my own keybindings live.
Highlights
- Chasing a real upstream bug. One of my AI plugins kept rejecting file access even inside my own home folder. After ruling out OneDrive and my own config, I traced it to a known Windows-specific bug in the plugin itself. Didn't think that debugging was actually going to be fun.
- Discovering gd (go to definition). A small feature, but the first moment Neovim actually felt faster than what I was used to, not just different.
- The recent-projects picker isn't a plugin I installed. It's a Lua feature I designed and wrote myself, including its own file-based persistence layer.
Reflections
The best part has been identifying the exact problems I've been having with other IDEs, and realising that fixing them is as simple as writing a new Lua function or using a pre-built package. That level of customisability is absolutely amazing, and I also love the fact that my hands don't move away from my keyboard anymore.
If there's anything I've learned from this experience, it's that most of the friction I put up with from other tools wasn't actually necessary. I just never had the option to fix it myself.
I'm still building it out, ironing out bugs and adding a few more features, but I'm having more fun writing code than ever before.