LazyVim Distribution
LazyVim is a Neovim distribution by Folke that transforms Neovim into a full-fledged IDE while keeping startup fast. It uses lazy.nvim for plugin management and provides a modular, extensible setup that you can customize like your own config.
Rather than choosing between starting from scratch or using a rigid pre-made distro, LazyVim offers the best of both worlds.
Features
| Feature | Description |
|---|---|
| IDE-grade | Auto-completion, LSP, diagnostics, formatting, git integration, file explorer, fuzzy finding |
| Fast startup | All plugins lazy-loaded — starts in ~100-200ms |
| Sane defaults | Pre-configured options, autocmds, and keymaps that follow best practices |
| which-key | Press <space> and see all available commands in a popup |
| Extras system | Enable language/editor features with one line of config |
| Reproducible | lazy-lock.json pins exact plugin versions |
| Override-friendly | Everything can be customized, disabled, or replaced |
Requirements
| Requirement | Minimum Version | Notes |
|---|---|---|
| Neovim | 0.11.2 | Must be built with LuaJIT |
| Git | 2.19.0 | For partial clone support |
| Nerd Font | v3.0+ | Optional, needed for icons |
| ripgrep | latest | For Telescope live grep |
| fd | latest | For Telescope file finding |
| lazygit | latest | Optional, for git UI |
| curl | latest | Required for blink.cmp completion engine |
Architecture
File Structure
~/.config/nvim/
├── init.lua ← Entry point: calls require("lazy").setup()
├── lazy-lock.json ← Plugin version lock file
└── lua/
├── config/
│ ├── autocmds.lua ← Your auto-commands (loaded automatically)
│ ├── keymaps.lua ← Your custom keymaps (loaded automatically)
│ ├── lazy.lua ← LazyVim bootstrap & lazy.nvim options
│ └── options.lua ← Your Neovim options (loaded automatically)
└── plugins/
├── core.lua ← Optional: plugin specs grouped by category
├── editor.lua
├── lsp.lua
├── telescope.lua
├── ui.lua
└── ... ← Add as many plugin files as needed
Do not require autocmds, keymaps, lazy or options under lua/config/ manually. LazyVim loads them automatically.
How Loading Works
The starter includes a pre-configured lazy.nvim setup that:
- Bootstrap lazy.nvim (auto-clone if not installed)
- Import
LazyVim/LazyVimwhich brings all pre-configured plugins - Import your
plugins/folder — your specs extend the defaults - Load
lua/config/options.lua(before plugins) - Load
lua/config/autocmds.luaandlua/config/keymaps.lua(on VeryLazy event)
require("lazy").setup({
spec = {
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
{ import = "plugins" },
},
})
Plugin Spec Merging Rules
When you add a plugin spec that already exists in LazyVim, instead of replacing defaults, these properties are merged:
| Property | Merge Behavior |
|---|---|
cmd | Extended with your custom commands |
event | Extended with your custom events |
ft | Extended with your custom filetypes |
keys | Extended with your custom keymaps |
opts | Merged with default opts |
dependencies | Extended with your custom dependencies |
| Everything else | Overrides the default |
LazyVim vs Vanilla Neovim
| Aspect | Vanilla Neovim | LazyVim |
|---|---|---|
| Startup time | ~50ms (empty) | ~100-200ms |
| Plugins | Manual install & configure each one | 50+ plugins pre-configured |
| Keymaps | None defined | Complete which-key-driven set |
| LSP setup | Manual lspconfig + Mason | Auto-handled via Mason |
| Formatting | Manual setup | conform.nvim pre-configured |
| File explorer | netrw (bare) | Neo-tree with icons |
| Fuzzy finder | None | Telescope + grep |
| Git integration | None | Gitsigns + Neogit + Diffview |
| Learning curve | Build everything yourself | Extend what's already working |
| Upgrades | Manual | :Lazy UI |
LazyVim Plugin Ecosystem
LazyVim ships with pre-configured plugins organized in these categories:
| Category | Plugins |
|---|---|
| UI | bufferline.nvim, lualine.nvim, noice.nvim, mini.icons, snacks.nvim (dashboard, notifier, indent guides, scroll) |
| Editor | grug-far.nvim (search/replace), flash.nvim (enhanced search), which-key.nvim, gitsigns.nvim, trouble.nvim, todo-comments.nvim |
| Coding | mini.pairs (auto pairs), ts-comments.nvim, mini.ai (enhanced text objects), lazydev.nvim (LuaLS for config) |
| LSP | nvim-lspconfig, mason.nvim, mason-lspconfig.nvim |
| Treesitter | nvim-treesitter, nvim-treesitter-textobjects, nvim-ts-autotag |
| Formatting | conform.nvim |
| Linting | nvim-lint |
| Util | snacks.nvim (bigfile, terminal), persistence.nvim (sessions), plenary.nvim |
Version Management
By default, the starter uses stable releases for lazy.nvim and LazyVim. To use the latest development version:
return {
{ "folke/lazy.nvim", version = false },
{ "LazyVim/LazyVim", version = false },
}
What's Next
- Installation — install LazyVim step by step
- Configuration — understand options, keymaps, and autocmds
- Plugins Overview — all pre-configured plugins detailed
- Extras — enable language/editor extras
- LazyVim Cheatsheet — complete keymap reference
- Recipes — common customization patterns