}

Neovim as a Modern IDE in 2026: LazyVim, LSP, and Essential Plugins

Neovim as a Modern IDE in 2026: LazyVim, LSP, and Essential Plugins

Neovim has crossed the threshold from "fast Vim with Lua" to "serious IDE alternative" for terminal-centric developers. It starts instantly, works over SSH without any remote server setup, consumes a fraction of VS Code's memory, and its modal editing model keeps your hands on the keyboard. In 2026, the LSP ecosystem is mature enough that completion, go-to-definition, inline diagnostics, and format-on-save work reliably across Python, Go, TypeScript, Rust, and most other languages.

The barrier has traditionally been configuration: getting all the pieces to talk to each other used to take days. LazyVim eliminates that problem.


Why Neovim Over VS Code for Terminal Users

The case for Neovim is clearest when you spend significant time in SSH sessions. VS Code's remote SSH extension works well but requires installing a server-side component and maintaining a reliable network connection. Neovim runs natively on the remote machine. Open a tmux session, connect from any machine, and your full IDE is waiting exactly as you left it.

Speed is the second argument. Neovim cold-starts in under 100ms. Opening a large Python project and getting completion ready takes a few seconds at most. Memory usage stays in the 50–150 MB range for most projects versus VS Code's 400 MB–1 GB.

The third argument is composability. Every piece of your editor is a Lua function you can inspect, override, and extend. There are no opaque extension APIs or sandboxed plugin contexts.


LazyVim vs. Building a Custom Config

You have two paths when starting Neovim as an IDE:

Custom config from scratch: Full control, but expect to spend several evenings getting LSP, completion, and formatting configured correctly and debugging plugin conflicts.

LazyVim: An opinionated distribution built on the lazy.nvim plugin manager. It ships with sensible defaults, a curated plugin set, and a predictable update mechanism. You can override any setting in your own files without forking the distribution. This is the right starting point for almost everyone.

LazyVim is maintained by Folke Lennvall, who also wrote lazy.nvim, which-key.nvim, noice.nvim, and trouble.nvim. The distribution is actively maintained and updated for Neovim stable releases.


Installing LazyVim

Neovim 0.10 or later is required. On Ubuntu 24.04+:

sudo apt install neovim       # may be older version
# For latest, use the AppImage or PPA:
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage
chmod +x nvim-linux-x86_64.appimage
sudo mv nvim-linux-x86_64.appimage /usr/local/bin/nvim

On macOS with Homebrew:

brew install neovim

Back up any existing config, then install LazyVim:

# Backup existing config
mv ~/.config/nvim ~/.config/nvim.bak 2>/dev/null
mv ~/.local/share/nvim ~/.local/share/nvim.bak 2>/dev/null

# Clone LazyVim starter
git clone https://github.com/LazyVim/starter ~/.config/nvim
rm -rf ~/.config/nvim/.git

Start Neovim — lazy.nvim will bootstrap itself and install all plugins automatically:

nvim

The first launch takes 30–60 seconds to download plugins. On subsequent starts everything is cached and loads instantly.


Config Structure

~/.config/nvim/
├── init.lua                  # Entry point, loads lazy.nvim
├── lua/
│   ├── config/
│   │   ├── lazy.lua          # lazy.nvim setup + LazyVim import
│   │   ├── keymaps.lua       # Your custom keymaps
│   │   └── options.lua       # Neovim options (tabstop, etc.)
│   └── plugins/
│       ├── example.lua       # LazyVim example overrides
│       └── ...               # Your custom plugin specs go here

Any .lua file you drop in lua/plugins/ is automatically loaded by lazy.nvim. This is where you add, override, or disable plugins without touching the LazyVim core.


Mason: Installing LSP Servers and Formatters

Mason is a package manager for language servers, linters, and formatters. It downloads pre-built binaries into ~/.local/share/nvim/mason/ — no system-level installs required.

Open the Mason UI:

:Mason

Navigate with arrow keys, press i to install. Useful packages to install:

  • pyright — Python LSP (type checking, completion)
  • ruff — Python linter/formatter
  • gopls — Go LSP
  • typescript-language-server — TypeScript/JavaScript LSP
  • lua-language-server — Lua LSP (for editing your Neovim config)
  • prettier — JS/TS/CSS/HTML formatter
  • stylua — Lua formatter

LazyVim includes mason-lspconfig.nvim which can auto-install LSP servers when you open a file of a given type. To configure this, add to lua/plugins/lsp.lua:

return {
  {
    "williamboman/mason-lspconfig.nvim",
    opts = {
      ensure_installed = {
        "pyright",
        "gopls",
        "ts_ls",
        "lua_ls",
      },
    },
  },
}

Neovim 0.11 Native LSP with vim.lsp.config()

Neovim 0.11 introduced a native way to configure LSP servers without needing nvim-lspconfig as an intermediary layer. If you are on 0.11+, you can configure servers directly:

-- In lua/plugins/lsp.lua or lua/config/lsp.lua
vim.lsp.config("pyright", {
  settings = {
    python = {
      analysis = {
        typeCheckingMode = "standard",
      },
    },
  },
})

vim.lsp.config("gopls", {
  settings = {
    gopls = {
      analyses = { unusedparams = true },
      staticcheck = true,
    },
  },
})

LazyVim handles the nvim-lspconfig integration transparently, so both approaches work depending on your Neovim version.


Completion with nvim-cmp and LuaSnip

nvim-cmp provides the completion popup. LazyVim includes it pre-configured with these sources:

  • LSP completions (function signatures, class members)
  • Buffer words (words in open buffers)
  • Path completions
  • LuaSnip snippet expansion

LuaSnip is the snippet engine. LazyVim ships with friendly-snippets which provides snippets for most languages out of the box. In insert mode, <Tab> expands snippets and navigates through snippet placeholders.

To add a custom snippet, create ~/.config/nvim/snippets/python.json following the VS Code snippet format — LuaSnip reads them natively.


Telescope: Fuzzy Find Everything

Telescope is the command palette, file finder, and grep UI all in one. Default LazyVim keymaps:

KeymapAction
<leader>ffFind files (respects .gitignore)
<leader>fgLive grep (ripgrep under the hood)
<leader>fbSwitch between open buffers
<leader>fsLSP document symbols
<leader>fSLSP workspace symbols
<leader>frRecent files
<leader>gcGit commits

Inside a Telescope picker, <C-j>/<C-k> moves through results, <CR> opens the selection, <C-v> opens in a vertical split, <C-t> opens in a new tab.

Telescope uses ripgrep for live grep and fd for file finding. Install both:

sudo apt install ripgrep fd-find   # Ubuntu
brew install ripgrep fd            # macOS

conform.nvim: Format on Save

conform.nvim handles format-on-save by calling the appropriate formatter for each filetype. LazyVim includes it. To configure your formatters, add lua/plugins/formatting.lua:

return {
  {
    "stevearc/conform.nvim",
    opts = {
      formatters_by_ft = {
        python = { "ruff_format", "ruff_organize_imports" },
        go = { "gofmt", "goimports" },
        javascript = { "prettier" },
        typescript = { "prettier" },
        lua = { "stylua" },
        json = { "prettier" },
        yaml = { "prettier" },
      },
      format_on_save = {
        timeout_ms = 3000,
        lsp_fallback = true,
      },
    },
  },
}

lsp_fallback = true means if no formatter is configured for a filetype, Neovim falls back to the LSP's built-in formatting.


Gitsigns: Inline Git Blame and Hunks

gitsigns.nvim shows git change indicators in the sign column (the narrow column left of line numbers): + for added lines, ~ for changed, - for deleted. LazyVim includes it.

Useful keymaps (LazyVim defaults):

KeymapAction
]hNext git hunk
[hPrevious git hunk
<leader>ghsStage hunk
<leader>ghrReset hunk
<leader>ghbToggle inline blame
<leader>ghdDiff this file

Inline blame shows git blame output at the end of the current line in a dimmed color. It updates as you move the cursor.


Treesitter: Better Syntax Highlighting

Neovim's built-in syntax highlighting uses regex. Treesitter uses a real parse tree, which means it understands code structure and produces accurate highlighting even in edge cases. It also enables:

  • Incremental selection: <C-space> to expand selection by syntax node
  • Text objects: if (inner function), ac (around class) for precise editing
  • Folding by syntax (fold a function body, not just indentation)

LazyVim installs Treesitter parsers automatically. To manually install a parser for a language:

:TSInstall python go typescript rust bash

Essential Keymaps Reference

LazyVim uses <Space> as the leader key. which-key.nvim shows available keymaps when you pause after pressing <leader>.

KeymapAction
gdGo to definition
grGo to references
giGo to implementation
KHover documentation
<leader>crRename symbol
<leader>caCode actions
<leader>cdLine diagnostics
]d / [dNext/prev diagnostic
<leader>eFile explorer (neo-tree)
<leader>ggLazyGit (if installed)
<leader>lOpen lazy.nvim plugin manager
<leader>cmOpen Mason

To see all keymaps: :WhichKey or just press <leader> and wait.


Getting Python, Go, and TypeScript Ready

After LazyVim is installed and Mason has the servers:

Python: Install pyright and ruff in Mason. Open any .py file. Completion, go-to-definition, and type checking diagnostics work immediately. Format on save runs ruff_format.

Go: Install gopls in Mason. Make sure gofmt and goimports are in PATH (go install golang.org/x/tools/cmd/goimports@latest). Open any .go file.

TypeScript: Install typescript-language-server and prettier in Mason. Open any .ts or .tsx file. Ensure node is in PATH.

Neovim's LSP integration in 2026 is mature. If a server is installed and Mason knows about it, opening the right file type is all it takes to activate it.

Leonardo Lazzaro

Software engineer and technical writer. 10+ years experience in DevOps, Python, and Linux systems.

More articles by Leonardo Lazzaro