# ๐Ÿ’ค lazy.nvim Modern plugin manager for Neovim ![image](https://user-images.githubusercontent.com/292349/207705153-077e183e-ae5f-4cbe-b1d8-07b7bf86026e.png) ## โœจ Features - ๐Ÿ“ฆ Manage all your Neovim plugins with a fancy UI - ๐Ÿš€ Fast startup: Automatically caches and compiles byte code of all lua modules needed during startup - ๐Ÿ’พ Partial clones instead of shallow clones - ๐Ÿ”Œ Auto lazy-loading of lua modules - ๐Ÿ“† Lazy-loading on events, commands, filetypes and key mappings - โณ Automatically installs missing plugins before starting up so you can start using Neovim right away - ๐Ÿ’ช Async execution for improved performance - ๐Ÿ› ๏ธ No need to manually compile plugins - ๐Ÿงช Correct sequencing of dependencies - ๐Ÿ“ Configurable in multiple files - ๐Ÿ’ป Dev option and patterns for using local plugin - ๐Ÿ“Š Profiling tools to optimize performance - ๐Ÿ”’ Lockfile `lazy-lock.json` to keep track of installed plugin versions - ๐Ÿ”Ž Automatically check for updates - ๐Ÿ“‹ Commit, branch, tag, version, and full [Semver](https://devhints.io/semver) support - ๐Ÿ“ˆ Statusline component to see the number of pending updates ## โšก๏ธ Requirements - Neovim >= **0.8.0** ## ๐Ÿ“ฆ Installation You can use the following Lua code to bootstrap **lazy.nvim** ```lua local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "--single-branch", "https://github.com/folke/lazy.nvim.git", lazypath, }) vim.opt.runtimepath:prepend(lazypath) end ``` Next step is to add **lazy.nvim** to the top of your `init.lua` ```lua -- You can use a lua module that contains your plugins. -- All sub modules of the lua module will also be automatically loaded -- This is the preferred setup so your plugin specs can be properly cached. require("lazy").setup("config.plugins", { -- add any optional configuration options here }) -- Alternatively you can specify a plugin list require("lazy").setup({ "folke/neodev.nvim", "folke/which-key.nvim", { "folke/neoconf.nvim", cmd = "Neoconf" }, }, { -- add any optional configuration options here }) ``` ## โš™๏ธ Configuration **lazy.nvim** comes with the following defaults: ```lua { root = vim.fn.stdpath("data") .. "/lazy", -- directory where plugins will be installed defaults = { lazy = false, -- should plugins be lazy-loaded? version = nil, -- version = "*", -- enable this to try installing the latest stable versions of plugins }, lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", -- lockfile generated after running update. concurrency = nil, ---@type number limit the maximum amount of concurrent tasks git = { -- defaults for the `Lazy log` command -- log = { "-10" }, -- show the last 10 commits log = { "--since=1 days ago" }, -- show commits from the last 3 days timeout = 120, -- kill processes that take more than 2 minutes url_format = "https://github.com/%s.git", }, dev = { -- directory where you store your local plugin projects path = vim.fn.expand("~/projects"), ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} }, install = { -- install missing plugins on startup. This doesn't increase startup time. missing = true, -- try to load one of these colorschemes when starting an installation during startup colorscheme = { "habamax" }, }, ui = { -- The border to use for the UI window. Accepts same border values as |nvim_open_win()|. border = "none", icons = { cmd = "๎ฏ‡ ", config = "๏€“", event = "๎ช†", ft = "๏€– ", init = "๏€“ ", keys = "๏„œ ", plugin = "๏’‡ ", runtime = "๎Ÿ… ", source = "๏„ก ", start = "๎ซ“", task = "โœ” ", }, throttle = 20, -- how frequently should the ui process render events }, checker = { -- automcatilly check for plugin updates enabled = false, concurrency = nil, ---@type number? set to 1 to check for updates very slowly notify = true, -- get a notification when new updates are found frequency = 3600, -- check for updates every hour }, performance = { cache = { enabled = true, path = vim.fn.stdpath("state") .. "/lazy.state", -- Once one of the following events triggers, caching will be disabled. -- To cache all modules, set this to `{}`, but that is not recommended. -- The default is to disable on: -- * VimEnter: not useful to cache anything else beyond startup -- * BufReadPre: this will be triggered early when opening a file from the command line directly disable_events = { "VimEnter", "BufReadPre" }, }, reset_packpath = true, -- reset the package path to improve startup time rtp = { reset = true, -- reset the runtime path to $VIMRUNTIME and your config directory ---@type string[] list any plugins you want to disable here disabled_plugins = { -- "gzip", -- "matchit", -- "matchparen", -- "netrwPlugin", -- "tarPlugin", -- "tohtml", -- "tutor", -- "zipPlugin", }, }, }, } ``` ## ๐Ÿš€ Usage ## ๐Ÿ“Š Profiler The profiling view shows you why and how long it took to load your plugins. ![image](https://user-images.githubusercontent.com/292349/207703263-3b38ca45-9779-482b-b684-4f8c3b3e76d0.png) ## ๐Ÿชฒ Debug See an overview of active lazy-loading handlers and what's in the module cache ![image](https://user-images.githubusercontent.com/292349/207703522-8bb20678-bb4c-4424-80e4-add3219711c3.png) ## ๐Ÿ“ฆ Differences with Packer - **Plugin Spec**: - `setup` => `init` - `requires` => `dependencies` - `as` => `name` - `opt` => `lazy` - `run` => `build` - `lock` => `pin` - `module` is auto-loaded. No need to specify ## ๐Ÿ“ฆ Other Neovim Plugin Managers in Lua - [packer.nvim](https://github.com/wbthomason/packer.nvim) - [paq-nvim](https://github.com/savq/paq-nvim) - [neopm](https://github.com/ii14/neopm) - [dep](https://github.com/chiyadev/dep) - [optpack.nvim](https://github.com/notomo/optpack.nvim) - [pact.nvim](https://github.com/rktjmp/pact.nvim)