Skip to main content

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

FeatureDescription
IDE-gradeAuto-completion, LSP, diagnostics, formatting, git integration, file explorer, fuzzy finding
Fast startupAll plugins lazy-loaded — starts in ~100-200ms
Sane defaultsPre-configured options, autocmds, and keymaps that follow best practices
which-keyPress <space> and see all available commands in a popup
Extras systemEnable language/editor features with one line of config
Reproduciblelazy-lock.json pins exact plugin versions
Override-friendlyEverything can be customized, disabled, or replaced

Requirements

RequirementMinimum VersionNotes
Neovim0.11.2Must be built with LuaJIT
Git2.19.0For partial clone support
Nerd Fontv3.0+Optional, needed for icons
ripgreplatestFor Telescope live grep
fdlatestFor Telescope file finding
lazygitlatestOptional, for git UI
curllatestRequired 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
danger

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:

  1. Bootstrap lazy.nvim (auto-clone if not installed)
  2. Import LazyVim/LazyVim which brings all pre-configured plugins
  3. Import your plugins/ folder — your specs extend the defaults
  4. Load lua/config/options.lua (before plugins)
  5. Load lua/config/autocmds.lua and lua/config/keymaps.lua (on VeryLazy event)
lua/config/lazy.lua (simplified)
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:

PropertyMerge Behavior
cmdExtended with your custom commands
eventExtended with your custom events
ftExtended with your custom filetypes
keysExtended with your custom keymaps
optsMerged with default opts
dependenciesExtended with your custom dependencies
Everything elseOverrides the default

LazyVim vs Vanilla Neovim

AspectVanilla NeovimLazyVim
Startup time~50ms (empty)~100-200ms
PluginsManual install & configure each one50+ plugins pre-configured
KeymapsNone definedComplete which-key-driven set
LSP setupManual lspconfig + MasonAuto-handled via Mason
FormattingManual setupconform.nvim pre-configured
File explorernetrw (bare)Neo-tree with icons
Fuzzy finderNoneTelescope + grep
Git integrationNoneGitsigns + Neogit + Diffview
Learning curveBuild everything yourselfExtend what's already working
UpgradesManual:Lazy UI

LazyVim Plugin Ecosystem

LazyVim ships with pre-configured plugins organized in these categories:

CategoryPlugins
UIbufferline.nvim, lualine.nvim, noice.nvim, mini.icons, snacks.nvim (dashboard, notifier, indent guides, scroll)
Editorgrug-far.nvim (search/replace), flash.nvim (enhanced search), which-key.nvim, gitsigns.nvim, trouble.nvim, todo-comments.nvim
Codingmini.pairs (auto pairs), ts-comments.nvim, mini.ai (enhanced text objects), lazydev.nvim (LuaLS for config)
LSPnvim-lspconfig, mason.nvim, mason-lspconfig.nvim
Treesitternvim-treesitter, nvim-treesitter-textobjects, nvim-ts-autotag
Formattingconform.nvim
Lintingnvim-lint
Utilsnacks.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:

lua/plugins/core.lua
return {
{ "folke/lazy.nvim", version = false },
{ "LazyVim/LazyVim", version = false },
}

What's Next