My Journey to Vim bindings and LazyVim
WIP! Last updated Oct 26 2025 while I am still updating my site
The magic
I first got into Vim bindings by watching ThePrimeagen. It seemed like magic, the way he could just fly through his text editor without ever reaching for the mouse. In contrast, I could feel a bit of friction with my IDE. I had made shortcuts for a lot of common actions, but I could sense that maybe there was something better out there.
Two attempts
I started with Vim bindings inside VSCode and JetBrains rather than jumping straight into the real thing. I actually tried the Vim tutorial at first, but it didn’t click. Everything felt slower than what I was replacing, and I went back to my old habits.
The second time I came back, I got further, and Vim started to click. I think the difference was having a reason to stick with it past the initial slowdown. Once ciw and dt) stopped being things I had to think about, I started to understand what all the fuss was about.
Installing Neovim (eventually)
Neovim was the new thing, so it was what I installed first. Maybe it was a desire for a faster competitive programming IDE, succumbing to the idea of increasing lifetime productivity, or FOMO to the 15 (top) percent of developers who actually use Vim, but I finally made the jump. On Windows, that jump turned into many hours of trying to get everything to work.
Ideally, I wanted to be able to switch between a regular terminal and WSL from inside Neovim. This was not trivial. Neovim’s terminal emulator can be configured, but the terminal context comes from wherever Neovim was opened, and getting that to behave from an AutoHotkey launcher was a headache. ChatGPT had been right about pretty much every installation step up to that point, but it could not produce the correct syntax for this even with correctional prompting, while the actual documentation made it clear in one read. Sometimes it is way easier to look at the docs.
Then there was the PATH. I thought I had a good idea of what it was, but Windows taught me a few things. The PowerShell PATH is the system path (global) plus the user path (local), and most things install to the user path. It is rebuilt on each launch of the terminal, so edits don’t show up until you reopen it. And the max length is 2048 characters; go over that and, well, who knows. There are great tools like Sysinternals for tracking low-level activity, but I did not end up finding the answer with them either.
After all was said and done, I could finally open Neovim, go to my competitive programming folder, create a file with all my preprocessor macros, and run it at a blazingly fast five seconds. Was it worth it? Ironically, probably. But the majority of the hours went into getting the editor to open at all, not into editing.
It was only when I installed Linux (Omarchy) that things went smoothly. The install was a couple of commands, and the terminal just worked.
Going with LazyVim
I had heard there is freedom and value in building a config from scratch, and I still believe that. There is something educational and long-term fulfilling about creating your own shortcuts; between my AutoHotkeys, PowerShell profile, Chrome extensions (plug: my simple extension GPTHotkeys), and Neovim, I have enough workflow configurations to keep them organized in a drive folder. But given my experience so far, I wanted the exposure and the guarantee that comes with a pre-packaged installation. Something that is known to work, so that when things break I know it’s me and not the setup.
So I started with LazyVim, and I grew to like it. The syntax highlighting is great, and the additions to editing, like text object motions, feel really nice. Being able to select or change a function argument or an entire function body with a couple of keystrokes is the kind of thing I was chasing when I first watched those videos.
Where it was hard
I had a somewhat difficult time with keybinding customization, and more generally with figuring out what a binding actually does and where it is defined. There is a lot of indirection between LazyVim’s defaults, the plugin’s defaults, and whatever I put in my own config.
The bigger realization was that your text editor is your driver. When you aren’t very sure how to get to a setting, or what to change in the first place, changing anything is much, much slower than it would be in a GUI with a settings menu. Every config change is a small detour in the tool you were trying to use to get work done.
LSP was the other rough spot. The upside of a language server manager like Mason is that it isn’t opinionated. The downside is the same thing: there are many different servers for the same language, and it isn’t obvious which one to pick or how they interact with formatters and linters.
Where I am now
I’m still on LazyVim, and the friction is slowly turning into muscle memory. The next step is probably understanding enough of the config to make it mine, rather than just living with the defaults.