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/formattergopls— Go LSPtypescript-language-server— TypeScript/JavaScript LSPlua-language-server— Lua LSP (for editing your Neovim config)prettier— JS/TS/CSS/HTML formatterstylua— 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:
| Keymap | Action |
|---|---|
<leader>ff | Find files (respects .gitignore) |
<leader>fg | Live grep (ripgrep under the hood) |
<leader>fb | Switch between open buffers |
<leader>fs | LSP document symbols |
<leader>fS | LSP workspace symbols |
<leader>fr | Recent files |
<leader>gc | Git 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):
| Keymap | Action |
|---|---|
]h | Next git hunk |
[h | Previous git hunk |
<leader>ghs | Stage hunk |
<leader>ghr | Reset hunk |
<leader>ghb | Toggle inline blame |
<leader>ghd | Diff 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>.
| Keymap | Action |
|---|---|
gd | Go to definition |
gr | Go to references |
gi | Go to implementation |
K | Hover documentation |
<leader>cr | Rename symbol |
<leader>ca | Code actions |
<leader>cd | Line diagnostics |
]d / [d | Next/prev diagnostic |
<leader>e | File explorer (neo-tree) |
<leader>gg | LazyGit (if installed) |
<leader>l | Open lazy.nvim plugin manager |
<leader>cm | Open 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.