Learn Docker With My Newest Course

Dive into Docker takes you from "What is Docker?" to confidently applying Docker to your own projects. It's packed with best practices and examples. Start Learning Docker →

Why I Switched from Vim to Neovim / LazyVim and How I Did It

why-i-switched-from-vim-to-neovim-lazyvim-and-how-i-did-it.jpg

This will be a 1,000 foot overview of the process.

Quick Jump:

Prefer video? Here it is on YouTube.

Back in early 2025 I switched from Vim to Neovim which you can find in this commit. Since then I’ve been using Neovim for programming, writing and note taking. This is after having used Vim since 2019 for similar workflows.

# Why?

At the end of 2024 I decided I’m done making compromises for the tools I use. This led to all sorts of changes and one of them was switching over to Neovim.

It’s not that Vim was bad but it had a couple of warts that I dealt with in my day to day.

Syntax highlighting was broken in some files, auto-formatting didn’t always work nicely in popular file types I dealt with and I didn’t want to learn Vim script to customize or fork some of the plugins I was using.

It was sometimes slow jumping around in large files and I found myself needing to open large CSV files once in a while.

I also wanted to start leaning on LSPs for more in-depth auto-complete and other features.

Honestly I also just wanted to shake it up a bit and see what things were like on the other side. I saw a couple of videos on YouTube of how folks were using Neovim and I liked what I saw. It also has a thriving community and the direction on where the project was heading looked good.

Given my workflows have always been terminal heavy, using Neovim over VSCode felt like a good fit because I did consider VSCode for a while too. I’ve used VSCode for years in the past, it’s what I used before switching to Vim.

Ultimately I decided to roll with Neovim and here we are.

# A Game Plan for Switching to Neovim

After years of using Vim I built up a ~700 line config file with over 55 plugins. It felt like a daunting task to start with an empty Neovim config and rewrite everything in Lua script.

I generally had an idea of what I wanted but getting there felt like a long road and at this point I wasn’t even sure I was 100% going to switch to Neovim. It didn’t make sense to invest weeks tweaking a ground zero config on day 1.

I mean sure, on paper Neovim seemed good but it has to be net improvement over my previous set up to continue using it.

LazyVim kept coming up again and again and with the power of Docker it was really easy to try everything out in a container before polluting my system with a bunch of dependencies.

I watched tons of videos on YouTube and scoured the docs. Once I was sold, I started figuring out how to go from my Vim set up to a working Neovim set up with LazyVim. I didn’t just want a replacement, I wanted an improvement.

After playing with the default LazyVim set up, it was time to make it my own. From the beginning I knew I was going to use this to jump start my set up and maybe hand roll a config later. So far hand rolling hasn’t been necessary yet!

Community Support

The only part I’m a little uneasy about is LazyVim and a whole bunch of useful plugins it uses are maintained by 1 person. Sometimes he posts about going on break for months and certain plugin updates are incompatible. That’s not a knock against his lifestyle, it sounds like he’s having a great time and am happy for him, but it does mean holding off on upgrades sometimes.

Thankfully it’s easy to pin a plugin to a specific version to hold off updating it.

One upside is the community is strong and when these things infrequently happen it usually only takes a day or 2, or even a few hours until someone posts a workaround or slight patch to make things work.

That’s the value in using something that a lot of other people use too. You don’t feel like you’re on an island by yourself figuring out how to make fire when the next island over already has a decked out kitchen with an oven.

Auditing My Vim Config

One of the first things I did was go through my entire Vim config file to see which plugins I still actively use and what configuration is important to me.

I was surprised in a good way. I was able to remove most of those plugins because features they provided were built into Neovim or LazyVim pulled in comparable plugins to replicate the behavior. Treesitter also let me drop 95% of my syntax highlighting related plugins.

Then I went through basic options, mappings, auto commands and more. I took this as an opportunity to make my key mappings more consistent and trim out things I weren’t using anymore. In some cases I also improved things since it was a fresh start.

My overall process was to carefully look at LazyVim’s docs and figure out which required plugins or optional plugins were available. I also looked at its source code to see exactly which settings were defined.

I never really learned Lua script but with general programming experience I found it to be quite approachable. It has quirks like any language but it’s very readable to at least understand what’s happening and you’re always 1 quick search on the internet away from figuring out something specific.

If I wanted to see how a plugin worked, I looked on YouTube. I like seeing how things work so that was a huge help. Typing the plugin name led to finding videos for most plugins.

It was a fun process. It was like going to a candy store but also with enough restraint to be ruthless on what I wanted to indulge in.

# Neovim / LazyVim Ecosystem

When using new tools being able to define their moving parts is helpful. This way you know where to look if something goes wrong or you want to tweak something.

  • Neovim: Code editor itself
  • LazyVim: Opinionated but customizable configuration for Neovim
  • Lazy: Package manager for Neovim plugins
    • Examples: Installing LazyVim itself and many other Neovim plugins
  • Mason: Package manager for LSP / DAP servers, linters and formatters
    • Examples: Installing shellcheck, ruff, various LSPs, etc.
  • Treesitter: Syntax highlighting for many languages and config types
    • Examples: Python, Ruby, Bash, etc.
  • Blink: Completion plugin for LSPs, snippets, commands and more
  • Snacks: Collection of quality of life plugins for Neovim
    • Examples: Fuzzy picker, explorer side bar, split terminals and more

The LazyVim community is very helpful. There’s active discussions on GitHub. When troubleshooting things don’t be afraid to look at LazyVim’s source code, remember it mainly pulls together a bunch of plugins and configuration on your behalf.

Overall I’m very happy I made the switch!

In a follow up post and video I’ll be demoing and breaking down my Neovim set up. It’s already up in my dotfiles, and I’ve had an install script to get everything up and running in 1 command for years. It works on Arch, Debian & Ubuntu with WSL 2 support and macOS too.

The video below mostly covers what’s in this post.

# Demo Video

Timestamps

  • 0:37 – Why did I switch?
  • 2:45 – Discovering LazyVim
  • 4:52 – LazyVim community support
  • 5:47 – Auditing my Vim config
  • 7:59 – Neovim / LazyVim ecosystem
  • 9:22 – I’m happy I made the switch

What set up are you using with Neovim? Let me know below.

Never Miss a Tip, Trick or Tutorial

Like you, I'm super protective of my inbox, so don't worry about getting spammed. You can expect a few emails per year (at most), and you can 1-click unsubscribe at any time. See what else you'll get too.



Comments