Using neovim with LazyVim

Published July 01, 2026

I've been a vim user for a long time. It was never my primary editor - I still tend to prefer a GUI - but it was my go-to when working from the command line. I've tried nano and emacs but for some reason, I've always preferred vim. Last year I was introduced to neovim and I saw right away that it was a huge improvement over base vim but it still had a pretty steep learning curve. A couple of weeks ago I was introduced to LazyVim and it is so much better.

Under the hood, LazyVim is just neovim. It's the same editor. What LazyVim gives you is a plugin manager and a base set of plugins that makes it much easier to configure. I have also found that the documentation for it tends to be simpler to understand making using it so much easier. I currently have my setup configured to use ruff for linting and formatting as well as the based PyRight LSP installed. (I am, after all, a Python developer.) I've also added a couple of custom key-maps:


vim.keymap.set("i", "qw", "", { noremap = true, silent = true })  -- use qw to exit from interactive mode
vim.keymap.set("n", "jj", ":%!jq ", { noremap = true, silent = true }) -- Use "jj" to format a JSON file.

The first one lets me use qw to exit interactive mode (and wasn't it just so much fun typing that in?) which is something useful because I will connect to my desktop from my iPad to do some things but the iPad's Magic Keyboard doesn't have an ESC key so I need to have some way to actually control the editor while I'm working.

The second one is a shortcut for formatting a JSON file. If I type jj in normal mode it will pass the entire buffer to jq and update the buffer contents with the response. Since I deal with a lot of JSON files in my day to day this is a huge help. Very often I get files that aren't formatted and being able to quickly load them in and format them makes my life much easier.

I'm sure that as I go along I will find more shortcuts and other customizations I want to add. As I'm typing this, the markdown linter is yelling at me for line lengths that are shorter than I would like (it's set to 80 and I prefer 120). That's easy to handle in free text but not so much in a code block so I'll need to figure out just how to configure that properly. Overall, I've been very pleased with what I've seen from LazyVim and would recommend you take a look at it if you are a vim user.

Edit:

I was able to fix the markdown issue after some searching. LazyVim is using markdownlint-cli for the linting and formatting so it was a matter of configuring it to look in the right place for a config file. I added this:


-- ~/.config/nvim/lua/plugins/markdown.lua
return {
  {
    "mfussenegger/nvim-lint",
    opts = {
      linters = {
        ["markdownlint-cli2"] = {
          args = { "--config", vim.fn.expand("$HOME/.markdownlint.json"), "--" },
        },
      },
    },
  },
  {
    "stevearc/conform.nvim",
    opts = {
      formatters = {
        ["markdownlint-cli2"] = {
          args = { "--config", vim.fn.expand("$HOME/.markdownlint.json"), "--fix", "$FILENAME" },
        },
      },
    },
  },
}

and put this config file in my home directory:


{
  "MD013": {
    "line_length": 120,
    "tables": false,
    "code_blocks": false
  },
  "MD041": false,
  "MD054": {
    "inline": true,
    "url_inline": false,
    "collapsed": false
  }
}

Once I did that it stopped yelling at me for things I don't care about. The bonus is that I enabled the formatter so it handles the line length issue automatically.


Previous: My PyCon US 2026